Autor |
Beitrag |
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Mo 17.07.06 21:11
ich habe ein paar kleine veränderungen an dem quelltext vorgenommen, aber nach wie vor gilt: du kannst eine komponente nicht in einer ihrer eigenen ereignisroutinen freigeben.
dafür müsstest du dir noch eine andere lösung einfallen lassen...
Einloggen, um Attachments anzusehen!
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Do 20.07.06 09:42
sry das ich mich erst so spät melde. funktioniert alles super!! aber wie kann ich die Panels wieder löschen?? Ich könnte es per timer oder über nen extra button realisieren! Denke mal die timer lösung ist nicht sehr elegant. Könnte ich das Problem auch mit Threads lösen?
grüße michael
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Do 20.07.06 09:46
hm... du könntest deinem Auto ein eigenes Event spendieren (sowas wie "ButtonClick")... und das rufst du aus dem Programm heraus auf (nicht innerhalb der Komponente).
Da drin machst du dann dein "free".
|
|
covel 
      
Beiträge: 131
Win XP PRo
Borland D7/C#
|
Verfasst: Fr 21.07.06 10:08
könntest du mir noch nen tip geben?? weiß nicht so recht wie ich anfangen soll.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Fr 21.07.06 10:40
Hallo,
ich hab auch mal mein Glück versucht. Du hast noch einige sehr unschöne Sachen drin, wie globale Variablen. *schüttel* Aber das wird schon.
Ich hoffe das hilft dir weiter.
MfG
freak 
Einloggen, um Attachments anzusehen!
_________________ "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: Fr 21.07.06 10:46
leider hilft mir das nicht weiter, da beim löschen des Panels immer noch eine Fehlermeldung kommt.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Fr 21.07.06 11:05
Welche Fehlermelfung bekommst du denn? Ich hatte mit meinem Code keine Probleme. Wäre auch noch interessant an welcher Stelle.
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: Fr 21.07.06 11:30
Der Fehler: ist eine Exception der Klasse EAccessViolation aufgetreten.
Der Fehler passiert in folgendem Quellcode. Denke mal es liegt daran das ich das Panel und den Button löschen will während dieser die Lösch-Aktion noch ausführt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| destructor TAuto.Destroy; begin btn_close.free; inherited; end;
procedure TAuto.BtnCloseClick(Sender:TObject); begin Self.Free; end; |
Ich müßte beim BtnCloseClick nen timer aufrufen, welcher als Parameter den namen des PAnel übergibt. Weiß aber nicht wie das gehen soll.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Fr 21.07.06 12:18
Vielleicht hilft dir das weiter.
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: Fr 21.07.06 13:55
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Fr 21.07.06 15:27
Ich hab es mit
Delphi-Quelltext 1:
| PostMessage(Parent.Handle, WM_KILL_CONTROL, 0, Integer(Sender)); |
versucht, aber das gibt wieder eine Exception.  Kannst du nicht auf den Schließen-Button verzichten und den Code direkt für das Panel benutzen? Oder ist das onClick schon belegt?
//edt: Versuch mal:
Delphi-Quelltext 1:
| PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer((Sender as TButton).Parent)); |
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 08:21
So das mit:
Delphi-Quelltext 1:
| PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer((Sender as TButton).Parent)); |
hat geklappt. Jedoch werden die Variablen Auto1, Auto2... nicht wieder freigegeben. Wie kann ich diese nun mit freigeben?? Habe es mit FreeAndNil(self) versucht, bekomme jedoch eine Exception.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 09:21
Wenn du das Auto.Create(Self); aufrifst wird als owner das Form gesetzt. Also wird das Objekt Auto freiigegegeben, wenn das Formular freigegeben wird. Bei FreeAndNil(); würde ich Auto als Parameter übergeben. Denn wenn du FreeAndNil(Self); in den Destructor von Autoschreibst wird dadurch der Destructor wieder aufgerufen.  Das ist sowieso recht tricky, was du da machst. An welcher Stelle steht dein FreeAndNil(Self);?
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 10:00
Delphi-Quelltext 1: 2: 3: 4: 5:
| destructor TAuto.Destroy; begin inherited Destroy; end; |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| unit objekte;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, unit1, Dialogs, ExtCtrls, StdCtrls;
const WM_KILL_CONTROL = WM_USER+ 66;
type TAuto= class(TPanel) private btn_close:TButton; procedure BtnCloseClick(Sender:TObject); procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer); procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
public procedure WMKillControl(var msg:TMessage); message WM_KILL_CONTROL; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end;
implementation var inReposition : boolean; oldPos : TPoint;
procedure TAuto.WMKillControl(var msg: TMessage); var c : TControl; i : Integer; begin c := TControl(msg.LParam); if not Assigned(c) then Exit; c.Free; windows.MessageBeep($FFFFFFFF); end;
constructor TAuto.Create(AOwner: TComponent); begin inherited Create(AOwner); Parent := TWinControl(AOwner); Visible := true; left:=10; top:=10; Width := 100; Height := 100; OnMouseDown:=ControlMouseDown; OnMouseUp:=ControlMouseUp; OnMouseMove:=ControlMouseMove;
btn_close := TButton.Create(Self); with btn_close do begin parent:=Self; width:=10; height:=10; caption:='x'; top:=0; left:=90; OnClick:=BtnCloseClick; end; end;
destructor TAuto.Destroy; begin inherited Destroy; end;
procedure TAuto.BtnCloseClick(Sender:TObject); begin PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer((Sender as TButton).Parent)); end; |
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 10:08
Ich denke es reicht, wenn du deine Atoobjekte im Destructor des Formulars frei gibst. 
_________________ "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 10:22
Wenn ich das richtig verstehe soll ich Auto1,Auto2... löschen wenn ich die Form1 schließe. Das ist jedoch nicht das was ich suche. ich will später beliebig viele Objekte (zb. Auto1,..Auto99) erstellen, die einzeln gelöscht werden können.
|
|
crowley
      
Beiträge: 406
Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
|
Verfasst: Mo 24.07.06 10:29
hallo covel...
da meld ich mich doch auch nochmal zu wort... dieses problem hast du seeehr oft bei allen möglichen klassen/komponenten/objekten...
und zwar legst du dir ein objekt/klasse/etc im hauptformular an... gibst es später frei... aber der zeiger des hauptformulars zeigt immer noch auf diese stelle im speicher (auch wenn er schon lange nicht mehr reserviert ist).
der ansatz von dir ist da nicht gut zu gebrauchen... wenn das objekt sich selber frei gibt, kriegt davon doch das hauptform nichts mit und kann folglich den zeiger auf das objekt nicht zurücksetzen.
besser wäre nun an dieser stelle, wenn du deinem Objekt zwar ein ButtonClick- Ereignis spendierst, dieses aber nach aussen hin sichtbar machst... dann kannst du im MainForm bei Auto.CloseButtonClick einfach dein
Delphi-Quelltext 1:
| FreeAndNil(TAuto(Sender)) |
machen
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 10:31
Das kannst du ja auch machen. Du kannst aber nicht ein Objekt im Objekt selbst freigeben. Mir fehlt ehrlich gesagt das Gesamtbild. Wir reden hier über Einzelprobleme. Vielleicht gibt es ja eine andere Möglichkeit. KAnnst du mir vielleicht mal schreiben was du überhaupt machen willst?
Ansonsten bin ich mit meinem Wissen jetzt auch am Ende. 
_________________ "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 10:37
So ich habe mal das Programm gepostet. Ich will beliebig viele Objekt erstellen, die ich dann einzeln löschen kann.
Einloggen, um Attachments anzusehen!
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 24.07.06 11:12
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| var Autos: Array[0..10] of TAuto;
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := Low(Autos) to High(Autos) do if not Assigned(Autos[i]) then begin Autos[i] := TAuto.Create(Self); Autos[i].Tag := i; break; end; end;
procedure TForm1.Button2Click(Sender: TObject); var i: Integer; begin for i := Low(Autos) to High(Autos) do FreeAndNil(Autos[i]); end;
procedure TForm1.Button3Click(Sender: TObject); begin FreeAndNil(Autos[Self.Tag]); end;
unit: objects
procedure TAuto.ControlMouseClick(Sender: TObject); begin (Self.Owner as TObject).Tag := Self.Tag; end; |
Ich würde das Array noch in den Public-Teil verschieben.
Ich hoffe das Hilft dir weiter. 
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|