![]() |
AW: Objekte zur Laufzeit erzeugen
Liste der Anhänge anzeigen (Anzahl: 1)
So dann will ich auch noch mal einen zum Besten (bzgl. der Formatierung) geben.
3 Varianten
Delphi-Quellcode:
und was
procedure Foo1;
begin if Voraussetzung then begin MeinCode1; MeinCode2; end else begin MeinCode2; MeinCode1; end; end; procedure Foo2; begin if Voraussetzung then begin MeinCode1; MeinCode2; end else begin MeinCode2; MeinCode1; end; end; procedure Foo3; begin if Voraussetzung then begin MeinCode1; MeinCode2; end else begin MeinCode2; MeinCode1; end; end; ![]() Anhang 41210 Ja, aus dem Grund nehme ich Variante 3 |
AW: Objekte zur Laufzeit erzeugen
Das versteh ich nicht, guter Sir. Warum Variante 3? Die ist... nicht schön. then in einer eigenen Zeile? Also wirklich.
Sherlock |
AW: Objekte zur Laufzeit erzeugen
Zitat:
Für mich zählt nur die Lesbarkeit und damit ist es für mich einfacher (damit schneller) die Struktur zu erfassen. Sobald die Bedingungen etwas umfangreicher werden (ab einer gewissen Schmerzgrenze lager ich aber Teile in Funktionen aus), dann schreibe ich das sogar so:
Delphi-Quellcode:
Dein Vorschlag wäre ja dann so
if //
Bedingung1 or // Bedingung2 or // Bedingung3 and Bedingung4 // then Foo else Bar;
Delphi-Quellcode:
Und wenn der automatische Zeilenumbruch (Codeformatierung) zuschlägt, dann wird es ganz doof
if Bedingung1 or Bedingung2 or Bedingung3 and Bedingung4 then
Foo else Bar;
Delphi-Quellcode:
Jetzt ist nicht auf einen kurzen Blick erkennbar, was wohin gehört. Bei meiner Variante sehe ich die einzelnen Teile sofort.
if Bedingung1 or Bedingung2 or
Bedingung3 and Bedingung4 then Foo else Bar; Und selbst diese Variante (ohne Zeilenkommentare) ist besser lesbar
Delphi-Quellcode:
if Bedingung1 or Bedingung2 or
Bedingung3 and Bedingung4 then Foo else Bar; |
AW: Objekte zur Laufzeit erzeugen
@Luki206
Nun da greift wer ins Klo. Mit anderen worten, ein Zeiger zeigt in die Botanik und nict mehr auf Speicher der für Deine Anwendung verfügbar ist. @all Heute hab ich da was über Haarspalterei gelesen... Manchmal kommt's darauf an, da ist auch so etwas gut brauchbar:
Delphi-Quellcode:
und ebenso
If bedingung1 then... else
If Bedingung2 then... else If Bedingung3 then... else .. If Bedingung99 then else showessage('Deine Daten sind Schrott');
Delphi-Quellcode:
if (Bedingung1 or
Bedingung2 or (Bedingung3 and Bedingung4)or Bedingung5 then ...... |
AW: Objekte zur Laufzeit erzeugen
Also richtig soll es angeblich so sein:
Delphi-Quellcode:
Persönlich mache ich es heute so (also fast richtig ;) ):
if a = b then
begin a := 1; b := 2; end else begin a := 2; b := 1; end;
Delphi-Quellcode:
Das ist eigentlich Quatsch, denn else gehört in die gleiche Ebene wie if:
if a = b then
begin a := 1; b := 2; end else begin a := 2; b := 1; end;
Delphi-Quellcode:
Früher machte ich es immer so, aber zumindest begin nach then, korrigiere aber inzwischen jeden Code damit:
if a = b then
begin a := 1; b := 2; end else begin a := 2; b := 1; end;
Delphi-Quellcode:
Man spart sich zwar mindestens eine Zeile, muss aber immer erst zwei mal gucken um zu sehen, dass die nächsten zwei Zeilen einen Block bilden. Die Übersichtlichkeit ist nicht so flüssig.
if a = b then begin
a := 1; b := 2; end else begin a := 2; b := 1; end; Furchtbar sind natürlich die ganz coolen Formen der Formatierung:
Delphi-Quellcode:
Das tue ich mir inzwischen fast gar nicht mehr an. Postet es einer so, ignoriere ich die Frage:
if a = b then
begin a := 1; b := 2; end else begin a := 2; b := 1; end;
Delphi-Quellcode:
Da muss ich zu sehr im Kopf den Code entwirren.
if a=b then
begin a:=1; b:=2; end else begin a:=2; b:=1; end; |
AW: Objekte zur Laufzeit erzeugen
Zitat:
![]() |
AW: Objekte zur Laufzeit erzeugen
Wenn ich für alles was ich im Leben sagte einen Quellennachweis liefen müsste...
Ich weiß nicht mehr wo ich es gesehen habe, ich habe es aber paar mal gesehen und es waren in der Regel Seiten von Unis. Auch sahen die Seiten in der Regel schön "klassisch" aus, also HTML pur, wie in den guten alten Zeiten Anfang 90. Womit ich also nicht behaupte, dass das neu ist, muss aber auch nicht alt sein. Ich gucke mal in meinen Lesezeichen ob ich da was finde. Andererseits ergibt das zum Teil einen Sinn.
Delphi-Quellcode:
Else ist ein Teil der If-Anweisung, gehört also in die gleiche Ebene, nicht eingerückt.
if a = b then
... else ... Begin und End bilden einen Block. Somit stellt sich die Frage wohn damit?
Delphi-Quellcode:
Das ist alles eine einzige Anweisung, auch wenn es über vier Zeilen verteilt ist. Woran erkennt man das? Spätestens daran, dass es nur ein abschließendes Semikolon am Ende gibt. Geht also auch so:
if a = b then
a := 1 else b := 2;
Delphi-Quellcode:
Wenn ich nun mehr als eine Zeile benötige, brauche ich einen Block.
if a = b then a := 1 else b := 2;
...
Delphi-Quellcode:
Und nun stellt sich die Frage zu was gehört Begin und End? Ist es ein Teil des Blocks selbst, dann muss man es so schreiben:
if a = b then
begin a := 1; b := 2 end else b := 2;
Delphi-Quellcode:
Oder ist es ein Teil der If-Anweisung, dann die vorherige Variante.
if a = b then
begin a := 1; b := 2 end else b := 2; |
AW: Objekte zur Laufzeit erzeugen
Delphi-Quellcode:
So würde ich es schreiben. Und Behauptungen, die man nicht belegen kann, sind eben nur Behauptungen.
if a = b then
begin a := 1; b := 2; end else b := 2; |
AW: Objekte zur Laufzeit erzeugen
Wenn
Delphi-Quellcode:
ein Teil der
else
Delphi-Quellcode:
-Anweisung ist und deswegen in die gleiche Ebene sollte wie das
if
Delphi-Quellcode:
, dann gilt das auch für
if
Delphi-Quellcode:
.
then
Sag ich doch die ganze Zeit ;) |
AW: Objekte zur Laufzeit erzeugen
Jetzt sind wir aber mittlerweile weit ab vom Thema, oder?
|
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?
|
AW: Objekte zur Laufzeit erzeugen
Wieso denn nicht?
[edit]
Delphi-Quellcode:
wird zu
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:
Fluppt auf Anhieb bei mir. [/edit]
type
TScrollBox = class(Forms.TScrollBox) private FButtons: TObjectList; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AddButtons(CountButtons: Cardinal; ClickEvent: TNotifyEvent); end; |
AW: Objekte zur Laufzeit erzeugen
Bei mir nicht... Forms wird nicht erkannt, was muss diesmal in die uses? :D
|
AW: Objekte zur Laufzeit erzeugen
Zitat:
Delphi-Quellcode:
bzw.
uses
Forms;
Delphi-Quellcode:
Und von Dokumentation hast du auch nichts gehört?
uses
Vcl.Forms; ![]() |
AW: Objekte zur Laufzeit erzeugen
Zur Not eine ScrollBox aufs Form klatschen und STRG-F9 drücken, die fehlenden Units fügt Delphi dann ganz automatisch hinzu.
|
AW: Objekte zur Laufzeit erzeugen
Ja das habe ich mir auch gedacht. Die uses VCL.Forms war auch von Anfang an eingebunden nur bekomme ich trotzdem den Fehler :gruebel:
|
AW: Objekte zur Laufzeit erzeugen
Delphi-Quellcode:
:roll:
type
TScrollBox = class(VCL.Forms.TScrollBox) |
AW: Objekte zur Laufzeit erzeugen
Ahhh, es war das Vcl. ... Danke :thumb:
|
AW: Objekte zur Laufzeit erzeugen
Ich muss mich hier noch einmal melden :hi: Jetzt stehe ich vor dem Problem das wenn ich die Form resizee bleiben die Buttons so in der Scrollbox wie sie auch erstellt wurden. Wie könnte ich es schaffen sie auszurichten ohne das sie ständig neu generiert werden müssen?
Danke Luki :spin: |
AW: Objekte zur Laufzeit erzeugen
Wie würstest du das denn machen, wenn du die Form im Form-Designer zusammenklicks?
Anchor, Align, usw. |
AW: Objekte zur Laufzeit erzeugen
Das mit den Anchors haut nicht hin weil ich dann nicht mehr scrollen kann und Align geht auch nicht weil ich ja nicht alle Buttons übereinander legen will. Und die buttons sollen ja auch 'nachrücken' wenn in einer Zeile ein weiterer Button reinpassen würde.
|
AW: Objekte zur Laufzeit erzeugen
Was hält dich davon ab, im OnResize einfach deine Controls programmtechnisch neu auszurichten? Das machst Du doch am, Anfang auch?
|
AW: Objekte zur Laufzeit erzeugen
Ja nur weiß ich nicht wie ich auf die Buttons wieder zugreifen soll.. Über die objectlist weiß ich nicht wie ich auf die Buttons zugreife.
|
AW: Objekte zur Laufzeit erzeugen
Du kannst entweder den Buttons beim Erstellen einen Namen geben (was sinnvoll wäre) oder immer durch die Komponenten der Form laufen und den Button entsprechend suchen. FindComponent bringt dir an der Stelle nix, da du keine Namen vergeben hast.
|
AW: Objekte zur Laufzeit erzeugen
Oder wie wäre es, wenn du die Buttons in andere Komponenten reinpackst?
- Diese kann man dann mit Anchor/Align ausrichten - oder man nimmt ausrichtende Komponenten (TFlowPanel/TGridPanel) - ... |
AW: Objekte zur Laufzeit erzeugen
Delphi-Quellcode:
Ist doch eine Objectlist wenn ich das richtig gesehen.
for i:= 0 to FButtons.count-1 do
Beginn FButtons[i].left:=10; //oder was auch immer fButtons[i].top:=10; //ist ja nur ein Bespiel End; |
AW: Objekte zur Laufzeit erzeugen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Das Ergebnis ist durchaus zufriedenstellend, wie das angehängte Bild zeigt:
Function TVorschau.ZeichneBilder : Boolean;
Var x,y, i,z : Integer; Obj : TBild; begin x := Allg.Bild_Abstand; y := Allg.Bild_Abstand; z := BList.Count; Try IF z > 0 THEN FOR i := 0 TO z-1 DO BEGIN Obj := BList[i]; Obj.Bild.Left := x; Obj.Bild.Top := y; Obj.Bild.Width := Allg.Bild_Breite; Obj.Bild.Height := Allg.Bild_Hoehe; Obj.Bild.Visible := True; Obj.Titel.Font := VPanel.Font; Obj.Titel.Color := Allg.BildTitel_Farbe; Obj.Titel.Width := Allg.Bild_Breite; Obj.Titel.Height := Allg.BildTitel_Hoehe; Obj.Titel.Left := Obj.Bild.Left; Obj.Titel.Top := Obj.Bild.Top + Allg.Bild_Hoehe; Obj.Titel.ShowHint := True; Obj.Titel.Visible := True; x := x + Allg.Bild_Breite + Allg.Bild_Abstand; IF x > (VPanel.ClientWidth - Allg.Bild_Breite - Allg.Bild_Abstand) THEN BEGIN x := Allg.Bild_Abstand; y := y + Allg.Bild_Abstand + Allg.Bild_Hoehe + Allg.BildTitel_Hoehe; IF VPanel.Height < (y + Allg.Bild_Abstand + Allg.Bild_Hoehe + Allg.BildTitel_Hoehe) THEN VPanel.Height := VPanel.Height + Allg.Bild_Abstand + Allg.Bild_Hoehe + Allg.BildTitel_Hoehe; END; END; Result := True; Except Result := False; End; end; |
AW: Objekte zur Laufzeit erzeugen
Ach so, Ok. Vielen Dank :thumb: Wie könnte ich eigentlich das umbauen das es auch mit Firemonky funktioniert? Also das mit dem erstellen der Buttons?
|
AW: Objekte zur Laufzeit erzeugen
@Luki206
Ich habe Deine Fragestellung nur schnell überflogen. Für den Fall, dass Du hier etwas entnehmen kannst: ![]() |
AW: Objekte zur Laufzeit erzeugen
@Stahli: Beim ausführen der ScrollBoxFlowR.dproj bekomme ich folgenden Fehler bzw. mir wird angezeigt das ich die "acntDelphiXE_R" nicht habe:
Code:
[dcc32 Fataler Fehler] ScrollBoxFlowR.dpk(37): E2202 Package 'acntDelphiXE_R' wird benötigt, konnte aber nicht gefunden werden
|
AW: Objekte zur Laufzeit erzeugen
Sorry, das ist ein älteres Package, das ich länger nicht mehr in der Hand hatte. Die acnt.. ist von den AlphaSkins, die ich damals eingesetzt hatte.
Ich denke, Du könntest die Verwendung einfach aus den benötigten Packages entfernen, bin aber jetzt nicht sicher, ob das reicht. Sonst nimm einfach nur die pas zum testen ohne komplettes Package. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 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