Delphi-PRAXiS
Seite 6 von 9   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekte zur Laufzeit erzeugen (https://www.delphipraxis.net/180410-objekte-zur-laufzeit-erzeugen.html)

Luki206 20. Mai 2014 18:17

AW: Objekte zur Laufzeit erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von DeddyH (Beitrag 1259545)
Jetzt sind wir aber mittlerweile weit ab vom Thema, oder?

Jap, aber vielen dank für die aufschlussreiche Erklärung wo
Delphi-Quellcode:
if; else; & begin; end;
stehen :thumb:

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..

DeddyH 20. Mai 2014 18:31

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.

Luki206 20. Mai 2014 18:51

AW: Objekte zur Laufzeit erzeugen
 
Mir ist aber nicht bekannt wo :gruebel: kann es etwas mit dem Style zu tun haben?

DeddyH 20. Mai 2014 19:02

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:
type
  TPanel = class(ExtCtrls.TPanel)
  private
    FButtons: TObjectList;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AddButtons(CountButtons: Cardinal; ClickEvent: TNotifyEvent);
  end;
Im Implementation-Teil dann das hier:
Delphi-Quellcode:
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;
Das Formular selbst wird noch um eine Methode erweitert:
Delphi-Quellcode:
  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;
Und der Formular-Code sieht in der Implementation dann so aus:
Delphi-Quellcode:
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;
Tritt der Fehler damit auch auf? [/edit]

Luki206 20. Mai 2014 19:07

AW: Objekte zur Laufzeit erzeugen
 
Ich meine ja, weil die Buttons mit Style richtig erzeugt werden und ohne Style bekomme ich ja den Fehler..

Dalai 20. Mai 2014 19:13

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

DeddyH 20. Mai 2014 19:14

AW: Objekte zur Laufzeit erzeugen
 
Ich habe meinen letzten Beitrag editiert, versuch das doch bitte mal mit und ohne Styles.

Luki206 21. Mai 2014 16:13

AW: Objekte zur Laufzeit erzeugen
 
Bei mir fängt es schon am
Delphi-Quellcode:
 TPanel = class(ExtCtrls.TPanel)
an.. er findet ExtCtrls nicht

DeddyH 21. Mai 2014 16:49

AW: Objekte zur Laufzeit erzeugen
 
ExtCtrls und Contnrs musst Du noch in die uses-Klausel im interface-Teil aufnehmen.

Luki206 22. Mai 2014 09:57

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.
Seite 6 von 9   « Erste     456 78     Letzte »    

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