![]() |
AW: Objekte zur Laufzeit erzeugen
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Delphi-Quellcode:
stehen :thumb:
if; else; & begin; end;
Nur weiß ich jetzt immer noch nicht warum ich ausgerechnet einen Fehler beim beenden des Programms bekomme. Nur was mich wundert, ich habe einen Style drin, wenn ich wieder auf das Windows-Theme umsteige bekomme ich einen Fehler beim erzeugen des zweiten Formulars.. |
AW: Objekte zur Laufzeit erzeugen
Die "0"-Adresse weist auf einen nil-Pointer hin, d.h. Du greifst sehr wahrscheinlich auf etwas zu, für das Du keinen Speicher reserviert hast.
|
AW: Objekte zur Laufzeit erzeugen
Mir ist aber nicht bekannt wo :gruebel: kann es etwas mit dem Style zu tun haben?
|
AW: Objekte zur Laufzeit erzeugen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe zwar keine Styles, aber daran liegt es vermutlich nicht.
[edit]Ich habe mal schnell ein Beispiel geschrieben (unter Delphi 7, höher steht mir gerade nicht zur Verfügung). Mach doch mal ein Testprojekt mit einem Panel und einem Button auf dem Hauptformular. Das Panel ziehst Du ein bisschen auf, damit ein paar Buttons darauf Platz finden (siehe Screenshot). Im Code schreibst Du oberhalb der Form-Deklaration folgenden Code:
Delphi-Quellcode:
Im Implementation-Teil dann das hier:
type
TPanel = class(ExtCtrls.TPanel) private FButtons: TObjectList; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AddButtons(CountButtons: Cardinal; ClickEvent: TNotifyEvent); end;
Delphi-Quellcode:
Das Formular selbst wird noch um eine Methode erweitert:
procedure TPanel.AddButtons(CountButtons: Cardinal;
ClickEvent: TNotifyEvent); const X_OFFSET = 10; //horizontaler Abstand Y_OFFSET = 10; //vertikaler Abstand BUTTONWIDTH = 75; //Breite jedes Buttons BUTTONHEIGHT = 25; //Höhe jedes Buttons var i: integer; ButtonsPerRow: integer; NewButton: TButton; begin //Evtl. schon vorhandene Buttons löschen FButtons.Clear; //Wieviele Buttons passen in eine Zeile bei Abstand rechts und links? ButtonsPerRow := (ClientWidth - X_OFFSET) div (X_OFFSET + BUTTONWIDTH); for i := 0 to CountButtons - 1 do begin //Neuen Button erzeugen, Eigenschaften zuweisen... NewButton := TButton.Create(nil); NewButton.Width := BUTTONWIDTH; NewButton.Height := BUTTONHEIGHT; NewButton.Caption := 'Button ' + IntToStr(Succ(i)); NewButton.Left := X_OFFSET + (BUTTONWIDTH + X_OFFSET) * (i mod ButtonsPerRow); NewButton.Top := Y_OFFSET + (BUTTONHEIGHT + Y_OFFSET) * (i div ButtonsPerRow); NewButton.OnClick := ClickEvent; NewButton.Parent := self; //... und der Liste hinzufügen FButtons.Add(NewButton); end; end; constructor TPanel.Create(AOwner: TComponent); begin inherited; FButtons := TObjectList.Create; end; destructor TPanel.Destroy; begin FButtons.Free; inherited; end;
Delphi-Quellcode:
Und der Formular-Code sieht in der Implementation dann so aus:
TForm1 = class(TForm)
Panel1: TPanel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } //wird den Buttons als Click-Event zugewiesen procedure DoOnClick(Sender: TObject); public { Public-Deklarationen } end;
Delphi-Quellcode:
Tritt der Fehler damit auch auf? [/edit]
procedure TForm1.DoOnClick(Sender: TObject);
begin if Sender is TButton then ShowMessage(TButton(Sender).Caption); end; procedure TForm1.Button1Click(Sender: TObject); begin Panel1.AddButtons(100, DoOnClick); end; |
AW: Objekte zur Laufzeit erzeugen
Ich meine ja, weil die Buttons mit Style richtig erzeugt werden und ohne Style bekomme ich ja den Fehler..
|
AW: Objekte zur Laufzeit erzeugen
Wenn der Fehler beim Beenden des Programms kommt, liegt es IMO nahe, wenn auf ein Objekt zugegriffen wird, das bereits freigegeben wurde. Auch hier hilft das Durchsteppen mit dem Debugger sehr beim Lokalisieren des Fehlers.
MfG Dalai |
AW: Objekte zur Laufzeit erzeugen
Ich habe meinen letzten Beitrag editiert, versuch das doch bitte mal mit und ohne Styles.
|
AW: Objekte zur Laufzeit erzeugen
Bei mir fängt es schon am
Delphi-Quellcode:
an.. er findet ExtCtrls nicht
TPanel = class(ExtCtrls.TPanel)
|
AW: Objekte zur Laufzeit erzeugen
ExtCtrls und Contnrs musst Du noch in die uses-Klausel im interface-Teil aufnehmen.
|
AW: Objekte zur Laufzeit erzeugen
Ok jetzt funktioniert es und der Fehler tritt nicht mehr auf. Nur wie bekomme ich jetzt die Buttons nicht in ein Panel sondern in eine ScrollBox? Ich habe auch eigentlich schon versucht TPanel in TScrollBox zu ändern aber ich denke so einfach ist das dann doch nicht oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz