Speicher Freigeben .free (gelöst) Danke

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Speicher Freigeben .free (gelöst) Danke

Beitrag von Ralph59 »

Hallo,

jetzt ist es mir langsam peinlich :oops:

Ich schreibe mir gerade eine kleine Unit, bei der mir auch schon mehr als geholfen wurde.
Die unit soll folgende Aufgaben übernehmen. Da mir ein Showmessage oder auch ein MessageDlg häufig nicht ausreicht um Informationen darzustellen, und sei es auch nur bei der Entwicklung, wollte ich mir eine kleine Unit schreiben-.

Die Übergabeparameter werden teilweise optional sein.

hier nun zu meinem Problem (Ich poste auch 2 Codestellen, die 1. funktioniert, ist aber wenig praktikabel, die 2. schmiert mir ab mit:
Bild
  • Dieses funtioniert

Code: Alles auswählen

function ShowInfoGrid(cAusgabe: TStringStringArray; coParButton: Array of TMeinTest; stPar: Array of String ):integer overload;
var
  myStringgrid1: TStringgrid;
  myForm, ParentForm : TForm;
  myButton1, myButton2, myButton3 : TBitBtn;
begin
  myForm := TForm.Create(Screen.ActiveForm) ;
  myStringgrid1 := TStringGrid.Create(myForm);
  myStringgrid1.Parent := myForm;
  myButton1 := TBitBtn.Create(myForm);
  myButton2 := TBitBtn.Create(myForm);
  myButton3 := TBitBtn.Create(myForm);
  myButton1.Parent := myForm;
  myButton2.Parent := myForm;
  myButton3.Parent := myForm;
...
  try
    myForm.ShowModal;
  finally
    myStringgrid1.Free;
    myButton1.free;
    myButton2.free;
    myButton3.free;
    myForm.free;
  end;
end;
  • Hier bekomme ich den besagten Fehler

Code: Alles auswählen

function ShowInfoGrid(cAusgabe: TStringStringArray; coParButton: Array of TMeinTest; stPar: Array of String ):integer overload;
var
  myStringgrid1: TStringgrid;
  myForm, ParentForm : TForm;
  myButtons : Array of TBitBtn; 
begin
  myForm := TForm.Create(Screen.ActiveForm) ;
  myStringgrid1 := TStringGrid.Create(myForm);
  myStringgrid1.Parent := myForm;
  for i := 0 to High(coParButton) do
  Begin
   myButtons[i] :=TBitBtn.Create(myForm);
     with myButtons[i] do
     begin
       Parent := myForm;
       ...
     end;
  end;
...
  try
    myForm.ShowModal;
  finally
      myStringgrid1.Free;
      for i := High(myButtons) downto 0 do
        myButtons[i].free;
   //********************************* Ab hier beim Aufruf von myForm.Free heht nichts mehr ***********************
    myForm.free;
 
  end;
end;
So wie es aussieht, ist der Fehler schon bei der Zuweisung.
myButtons :=TBitBtn.Create()

wobei
myButtons[0] :=TBitBtn.Create() zu liegen,
myButtons[1] :=TBitBtn.Create() zu liegen,
auch nicht funktioniert.

Vielleicht weiß ja einer von euch Informatikern weiter :?:

Mit freundlichem Gruß

Ralph
Zuletzt geändert von Ralph59 am So 31. Okt 2010, 14:16, insgesamt 2-mal geändert.
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicher Freigeben .free

Beitrag von theo »

Du kannst dir das freen der Komponenten sparen. Diese werden automatisch mit dem Owner freigegeben.
Das ist hier z.B.
TStringGrid.Create(myForm);
die myForm.

Deshalb kommt es auch zu dem Fehler, da myForm noch mal alles freen will.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Speicher Freigeben .free

Beitrag von Ralph59 »

Hallo theo,

danke, habe ich auch getestet, war mir jedoch nicht sicher, dass wenn der Owner freigibt, dass dann alles freigegeben ist. :?

Aber,
die Anwendung stürtzt trotzdem ab bei

myForm.free

wenn ich die Bitbuttons in einem Array erstelle :(

Hast Du eine Idee?

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicher Freigeben .free

Beitrag von theo »

Ich sehe ja nicht, was du da genau machst. Vielleicht solltest du einfach mal nachdenken. ;-)

Seltsam aussehen tut z.B.

for i := 0 to High(coParButton) do
Begin
myButtons :=TBitBtn.Create(myForm);

Du nimmst High von coParButton und füllst dann myButtons.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Speicher Freigeben .free

Beitrag von Ralph59 »

Hallo theo,

es mag ja seltsam aussehen, aber wichtig ist, dass der integer Wert, der in coParButton steht an die Funktion übergeben wird, die Anzahl der darzustellenden Buttens darstellt.
Da ich vorher bereits die Größe des Arrays bestimmt habe mit
SetLength(myButtons, High(coParButton));
steht da eigentlich der selbe Wert drin.

Ich habe gerade mal folgendes probiert, anstelle die Buttens in einem Array zu definieren, habe ich diese in einer separaten Prozedur erstellt. Nicht Glücklich ist, dass ich als Übergabemarameter den zugehörigen Owner übergebe, ist aber nur ein Test hier könnte evtl. auch die id des gleichen stehen.

hier der Code, der auch funktioniert.

Code: Alles auswählen

procedure CreateBitBtn(myForm: TForm; id: integer);
var
  myBitButton: TBitBtn;
begin
  myBitButton := TBitBtn.Create(myForm);
  myBitButton.Parent := myForm;
  myBitButton.Name:='myBitBtn'+inttostr(id);
  myBitButton.Tag:=id;
  myBitButton.OnClick:=@ButtonClick;   // es soll sichja auch was tun, wenn der Button gedrückt wird
end;
Aufgerufen mit:

Code: Alles auswählen

for i := 0 to High(coParButton) do CreateBitBtn(myForm, i);
Trotzdem frage ich mich, und das ist mir wirklich wichtig, warum funktioniert die Zuweisung in einem Array nicht, folgendes geht nämlich auch nicht:

Code: Alles auswählen

myButtons[0] :=TBitBtn.Create(myForm);
  myButtons[1] :=TBitBtn.Create(myForm);
Die Buttons arbeiten zwar richtig, aber bei der Speicherfreigabe des Fenster crasht die Applikation.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicher Freigeben .free

Beitrag von theo »

Ralph59 hat geschrieben: SetLength(myButtons, High(coParButton));
steht da eigentlich der selbe Wert drin.
Das stimmt nicht ganz.
Wenn du Setlength(arr,3) machst, dann ist High(arr) 2!! (0,1,2)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Speicher Freigeben .free

Beitrag von mse »

Ralph59 hat geschrieben: SetLength(myButtons, High(coParButton));
SetLength(myButtons, length(coParButton));

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Speicher Freigeben .free

Beitrag von Ralph59 »

Sch...,

das ist mir jetzt aber wieder einmal wirklich peinlich. :oops:

Ich habe die halbe Nacht gegrüblet, aber wenn man einmal auf dem Schlauch steht, dann scheint man wohl darauf zu stehen. :x

Dabei haben wir darüber gestern erst gesprochen. :(

Vielen Dank für eure schnelle Hilfe, wenn die Größe des Arrays natürlich nicht stimmt, dann kann da was nicht funktionieren. :?


Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicher Freigeben .free

Beitrag von theo »

Ralph59 hat geschrieben: Ich habe die halbe Nacht gegrüblet, aber wenn man einmal auf dem Schlauch steht, dann scheint man wohl darauf zu stehen. :x
Auf dem Schlauch stehen ist das eine, das kann ja mal vorkommen.
Schlimmer ist aber, unsauber zu arbeiten.
Das:
for i := 0 to High(coParButton) do
Begin
myButtons :=TBitBtn.Create(myForm);

Ist einfach schlecht. Damit stellst du dir selber eine Falle. Ausserdem ist es unübersichtlich und für Dritte und dich selbst schwer verständlich.
Wenn man sowas gleich sauber macht, passieren viel weniger "seltsame" Dinge.

Ist nicht böse gemeint, ganz im Gegenteil! ;-)

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Speicher Freigeben .free (gelöst) Danke

Beitrag von Ralph59 »

Hallo Theo,

hast ja recht,

besser so?

for i := 0 to High(myButtons) do
Begin
myButtons :=TBitBtn.Create(myForm);

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicher Freigeben .free (gelöst) Danke

Beitrag von theo »

Ralph59 hat geschrieben: besser so?
Klar. War aber mehr grundsätzlich gemeint, für die nächste Falle ;-)

Antworten