Delphi-PRAXiS
Seite 2 von 9     12 34     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 19. Mai 2014 14:48

AW: Objekte zur Laufzeit erzeugen
 
-BoxScro hat jetzt einen Parent

-FrmUse steht in der Erstellungsreihenfolge als zweites und wird durch FrmUse.Show; aufgerufen

-LBut liegt in private und ist so deklariert:
Code:
LBut: array of TButton;

mkinzler 19. Mai 2014 14:52

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

-LBut liegt in private und ist so deklariert:
Code:
LBut: array of TButton
;
Dann solltest du den Array auch dimensionieren

Delphi-Quellcode:
setLength( LBut, FrmOpen.CDS.RecNo+1);

Jumpy 19. Mai 2014 14:55

AW: Objekte zur Laufzeit erzeugen
 
Delphi-Quellcode:
  LBut[i].Left := 20 + ((LBut[i].Height + 10) * i);
  LBut[i].Height := 20;
  if (i >= 5) then LBut[i].Height := 20 + ((LBut[i].Height + 10) * i);
Ist jetzt nicht zum eigentlichen Problem, weil mMn die Hälfte der Infos fehlen, die man bräuchte, um einen vernünftigen Rat zu erteilen. Daher nur zum obigen Codeschnipsel:

Wieso hängt die linke Position von der Höhe ab (die dazu erst noch in der nächsten Zeile gegeben wird? Wie wird die wohl vorher gewesen sein?).

Button für i>5 werden größer??? Sollte hier Top gemeint sein???

Luki206 19. Mai 2014 15:17

AW: Objekte zur Laufzeit erzeugen
 
Ok ich habe alles jetzt noch einmal bearbeitet, habe die Länge des Array's gesetzt und habe auch die Fehler mit dem was Jumpy angesprochen hat beseitigt. Nur wird nur ein Button erzeugt. die prozedure sieht jetzt so aus:
Delphi-Quellcode:
procedure TFrmUse.GenerateButton;
var i: Integer;
begin
BoxScro := TScrollBox.Create(TabAbrech);
BoxScro.Parent := TabAbrech;
BoxScro.ParentBackground := true;
BoxScro.Align := alClient;
BoxScro.BorderStyle := bsNone;
FrmOpen.CDS.First;
 for i := 1 to High(Self.LBut) do begin
   LBut[i] := TButton.Create(BoxScro);
   LBut[i].Parent := BoxScro;
   LBut[i].Left := 20 + 2*(i+1);
   LBut[i].Top := 30;
   if (i >= 5) then LBut[i].Top := 30 + 2*(i+1);
   LBut[i].Caption := FrmOpen.CDS.FieldByName('speise').Value;
   FrmOpen.CDS.Next;
 end;
end;

DeddyH 19. Mai 2014 15:25

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Delphi-Quellcode:
for i := 1 to High(Self.LBut) do begin

Sicher, dass das so stimmt?

Sir Rufo 19. Mai 2014 15:28

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von DeddyH (Beitrag 1259384)
Zitat:

Delphi-Quellcode:
for i := 1 to High(Self.LBut) do begin

Sicher, dass das so stimmt?

Eben, wer
Delphi-Quellcode:
high
sagt muss auch
Delphi-Quellcode:
fisch
- äh
Delphi-Quellcode:
low
sagen.
Delphi-Quellcode:

for i := low( Self.LBut ) to high( Self.LBut ) do

Zoot 19. Mai 2014 15:29

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von Luki206 (Beitrag 1259382)
Delphi-Quellcode:
   ...
   LBut[i].Left := 20 + 2*(i+1); // also 24, 26, 28 ... ???
   ...
   if (i >= 5) then LBut[i].Top := 30 + 2*(i+1); // also 42, 44, 46, 48 ???
   ...


Welche Breite haben die Buttons, wenn 2 pixel später schon der nächste beginnt?
Und die Oberkante wird für i>5 immer größer??

mkinzler 19. Mai 2014 15:30

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Ja, ich bin mir sicher: Nein!
Delphi-Quellcode:
procedure TFrmUse.GenerateButton;
var i: Integer;
begin
BoxScro := TScrollBox.Create(TabAbrech);
BoxScro.Parent := TabAbrech;
BoxScro.ParentBackground := true;
BoxScro.Align := alClient;
BoxScro.BorderStyle := bsNone;
FrmOpen.CDS.First;
setLength( LBut, FrmOpen.CDS.RecNo+1);
for i := 1 to FrmOpen.CDS.RecNo do
begin
   LBut[i] := TButton.Create(BoxScro);
   LBut[i].Parent := BoxScro;
   ...
   FrmOpen.CDS.Next;
 end;
end;

Luki206 19. Mai 2014 15:38

AW: Objekte zur Laufzeit erzeugen
 
Ok danke, nur bekomme ich jetzt nur 2 Button..

DeddyH 19. Mai 2014 15:40

AW: Objekte zur Laufzeit erzeugen
 
RecNo, nicht RecordCount? Ich persönlich würde aber sowieso einer Liste (TObjectList/TComponentList) den Vorzug geben, einfach mit First/Next über die Datenmenge iterieren und den neuen Button mit Add() der Liste hinzufügen, das ist weniger Gefummel und schneller dürfte es auch sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 2 von 9     12 34     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