Autor Beitrag
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Mo 24.07.06 12:50 
Also:

Mit
ausblenden 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 24.07.06 13:42 
So werde es nun wie folgt machen:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: 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 ... 8)

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: 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. :roll:

MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 24.07.06 14:42 
genau das passiert das problem ist nur das dann die Variable Auto1 usw. nicht freigegeben werden.
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Mo 24.07.06 14:45 
user profile iconcovel 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: 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...

ausblenden 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
ausblenden 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;

{...}

{
 wo immer du ein Auto anlegst:
 Autos[x].OnCloseClick := CloseButtonClick;
}


procedure TForm1.CloseButtonClick(Sender:TObject);
begin
  FreeAndNil(Autos[TAuto(Sender).Tag)]); // müsste eigentlich so klappen
end;


ist in jedem falle eine "schönere" lösung...
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: Mi 26.07.06 11:30 
Wann tritt denn ein Fehler auf?
Bei mir läuft das Proggi einwandfrei.

_________________
cum grano salis
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Mi 26.07.06 11:39 
Wenn ich alle 3 Panels erstelle und dann das in der Mitte lösche bekomm ich ne AV. :oops:

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: 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