Autor |
Beitrag |
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mo 24.07.06 12:34
Das hat mir weiter geholfen. Aber der button3 war nur zu testzwecken. Den Button2 wird soll es später auch nicht geben.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button3Click(Sender: TObject); begin FreeAndNil(Autos[Self.Tag]); end; |
dieser Code sollte bei dem Btn_close der sich auf dem Panel befindet ausgelöst werden.
Ich weiß aber nicht wie ich den Namen des Panels übermitteln muss/soll.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 12:50
Also:
Mit
Delphi-Quelltext 1: 2: 3: 4:
| procedure TAuto.BtnCloseClick(Sender:TObject); begin PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer((Sender as TButton).Parent)); end; |
rufst du ja
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TAuto.WMKillControl(var msg: TMessage); var c : TControl; begin c := TControl(msg.LParam); if not Assigned(c) then Exit;
c.Free; windows.MessageBeep($FFFFFFFF); end; |
auf.
In msg.LParam steht das Handle (vermute ich mal, zumindest eine IdentifikationsID) des entsprechenden Autos. Also wird für das Auto Free aufgerufen. c.Free = Auto.Free. Das machen wir, weil sich ein Objekt nicht selbst zerstören und freigeben kann.
//Edit: (Sender as TButton).Parent) = Panel = Autos[i]
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mo 24.07.06 13:42
So werde es nun wie folgt machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TAuto.BtnCloseClick(Sender:TObject); begin (Self.Owner as TObject).Tag := Self.Tag; form1.Button3.Visible :=true;
end; |
button3:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button3Click(Sender: TObject); begin FreeAndNil(Autos[Self.Tag]); button3.Visible := false; end; |
ist zwar nicht ganz das was ich machen wollte..aber nunja man kann nicht alles haben  Besten Dank @ freak4fun und crowley
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 13:56
Und was willst du mit dem Visible jetzt bewirken? Tut mir leid, kann ich nicht nachvollziehen. Aber du wirst schon wissen was du machst ...
Ich würd dann am Ende auch gern mal das fertige Programm sehen, wenn du nichts dagegen hast.
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mo 24.07.06 14:05
Die Panels und der dazu gehörige Name der Variable sollte per Btn_click gelöscht werden. Da dies nicht so einfach möglich ist, habe ich nun den Button3 zur hilfe genommen. Dieser Button wird nur sichtbar wenn der Btn_close gedrückt wird.
Wenn das Programm fertig ist, werde ich mich bei dir melden.
Grüße Michael
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 14:38
Aber es funktioniert doch, oder nicht. Wen man auf erstellen clickt kommt ein Panel und wenn man auf den 'x'-Button clickt verschwindet es wieder. Ist es nicht das was du wolltest? Wenn du jetzt mit dem butto3 arbeitest und damit das Panel löscht kannst du dir den 'x'-Button und das PostMessage + Anhang sparen.
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mo 24.07.06 14:42
genau das passiert das problem ist nur das dann die Variable Auto1 usw. nicht freigegeben werden.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 14:45
covel hat folgendes geschrieben: | das problem ist nur das dann die Variable Auto1 usw. nicht freigegeben werden. |
Was verstehtst du denn unter "freigegeben"? Weißt du was c.Free; in meinem/deinem Code macht?  Ich würde dir gern weiterhelfen, aber ich seh dein Problem leider nicht.
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Mo 24.07.06 15:52
@freak
C.free bewirkt zwar, dass der Speicher freigegeben wird, aber Auto1 noch immer auf dieser Speicherbereich zeigt... da fehlt an der Stelle ein Auto1 := nil
@covel
ich habe gerade die große befürchtung, dass du dir damit überhaupt keinen gefallen tust, wie du das machst. von hinten durch die brust ins auge würd man dazu wohl sagen. bitte nimmer nicht wieder in deine auto-klasse das fixe form1 rein und mach es dir doch nicht so unnötig schwer...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| unit objekte;
type TAuto = class(TPanel) private FCloseClick: TNotifyEvent; procedure BtnCloseClick(Sender:TObject); published property OnCloseClick: TNotifyEvent read FCloseClick write FCloseClick; end;
procedure TAuto.BtnCloseClick(Sender:TObject); begin if Assigned(FCloseClick) then FCloseClick(Self); end; |
das ist das, was du in deiner objekte.pas machen musst... nun noch Form1
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| type TForm1 = class(TForm) procedure CloseButtonClick(Sender:TObject); private public end;
procedure TForm1.CloseButtonClick(Sender:TObject); begin FreeAndNil(Autos[TAuto(Sender).Tag)]); end; |
ist in jedem falle eine "schönere" lösung...
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Mo 24.07.06 15:53
aus versehen doppeltes posting
Zuletzt bearbeitet von crowley am Mi 26.07.06 11:23, insgesamt 1-mal bearbeitet
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mi 26.07.06 11:17
Moin, leider klappt es noch immer nicht. Habe den Quellcode von crowley übernohmen. Jedoch tretten Fehler beim Löschen der einzelnen Panels auf.
Das Programm liegt als Anhang bei. Wäre schön wenn jemand mal drüber gucken könnte
Grüße Michael
Einloggen, um Attachments anzusehen!
|
|
Softchaos67
      
Beiträge: 103
XP Prof
Delphi 7
|
Verfasst: Mi 26.07.06 11:30
Wann tritt denn ein Fehler auf?
Bei mir läuft das Proggi einwandfrei.
_________________ cum grano salis
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mi 26.07.06 11:39
Wenn ich alle 3 Panels erstelle und dann das in der Mitte lösche bekomm ich ne AV. 
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Mi 26.07.06 11:46
Der Fehler tritt beim löschen der Panels über den X-Button auf. Über den Löschen-Button werden bei mir auch alle panels wieder gelöscht.
Der Fehler tritt immer auf wenn die das zweite Panel löschen will, ebal wie viele ich erstelle...
|
|
Softchaos67
      
Beiträge: 103
XP Prof
Delphi 7
|
Verfasst: Mi 26.07.06 11:55
Ok, hab den Fehler jetzt auch. Immer wenn man das Panel Nummer 1 löscht, aber nur einmal, dann klappts.
Vielleicht hat das was mit dem Harakiri deiner Komponente zu tun.
_________________ cum grano salis
|
|