Komponenten zur Laufzeit erzeugen

Rund um die LCL und andere Komponenten
Antworten
pierredrks
Beiträge: 34
Registriert: Do 4. Okt 2007, 18:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Braunfels

Komponenten zur Laufzeit erzeugen

Beitrag von pierredrks »

Hallo
ich versuche zur Laufzeit mehrere Shapes zu erstellen, allerdings kommt beim Ausführen die Fehlermeldung external :sigsegv.

Code: Alles auswählen

a[i,j]:=TShape.Create(Panel1);  //Hier ist der Fehler
      with a[i,j] do
      begin
        Top:=0;
        Left:=0;
        Width:=10i;
        Height:=10;
        show;
      end;
Vermutlich liegt der Fehler am Array. Also habe ich das mal weggelassen und folgendes probiert:

Code: Alles auswählen

c:=TButton.Create(Form1);
  c.Top:=300;
  c.Left:=300;
  c.Width:=100;
  c.Height:=100;
  c.Visible:=true;
  c.Caption:='Knopf';
  c.Show;
der Code funktioniert ohne Probleme, nur habe ich hier das Problem, dass der Button nicht angezeigt wird. Hat jemand eine Idee wo der Fehler ist?
Das Herz besitzt Gründe, die die Vernunft nicht kennt.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Code: Alles auswählen

Width:=10i;
Schreibfehler hier, oder Fehler :?:
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich weiss es ist eigentlich eine unart aber Shapes zur Laufzeit zu erzeugen macht warscheinlich keinen sinn. Rech speicherfressende Methode und mit dem selben Codeaufwand warscheinlich weniger hast du das ganze auf nen Canvas gezeichnet.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Du solltest mal das Parent Property zuweisen.

Ansonsten gebe ich Christian recht. Nicht gerade schlau, das so zu machen.
Zeichen lieber dein "Grid" oder sonstwas auf den Canvas.

Bei deinem Code kommt's wahrscheinlich auch noch drauf an, wo du den ausführst.
In OnCreate kann es zu früh sein, da dort noch nichts sichtbar ist.

pierredrks
Beiträge: 34
Registriert: Do 4. Okt 2007, 18:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Braunfels

Beitrag von pierredrks »

monta hat geschrieben:

Code: Alles auswählen

Width:=10i;
Schreibfehler hier, oder Fehler :?:
Schreibfehler :)
Ich nutze Shapes da ich für jedes ein onclick event benötige und zu faul war/bin die
Mausposition abzufragen um zu prüfen welches Quadrat angeclickt wurde.
Der erste Code wurde ausgeführt wenn der Wert eines LabelEdit geändert wurde und der zweite Test-Code wenn ein Button gedrückt wurde.

Falls jemand eine bessere Idee hat:
Ich möchte ein Raster erzeugen, in dem jedes Element angeklickt werden kann.

Gruß
Pierre
Das Herz besitzt Gründe, die die Vernunft nicht kennt.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pierredrks hat geschrieben: Ich nutze Shapes da ich für jedes ein onclick event benötige und zu faul war/bin die
Mausposition abzufragen um zu prüfen welches Quadrat angeclickt wurde.
Wenn du zu faul bist, solltest du schlafen gehen und nicht weiter programmieren ;-)

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

pierredrks hat geschrieben:Ich möchte ein Raster erzeugen, in dem jedes Element angeklickt werden kann.
Stringgrid oder Drawgrid wäre möglich, kannst ja je nach Rastergröße die Zellenhöhe/Breite entsprechend setzen.
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

So ein Raster auf den Canvas zu erzeugen ist viel einfach.
und das abfangen der Maus Pos auch.
Wenn das raster sagen wie 20X20 pixel groß ist könntest du folgendes bei onmousedown machen:
x div 20; y div20;

Die werte auffangen und fertig. Die kannst du für dein 2D Array verwenden.
Jetzt musst du nur noch das raster mit zwei For schleifen Zeichnen.
MFG
Michael Springwald

pierredrks
Beiträge: 34
Registriert: Do 4. Okt 2007, 18:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Braunfels

Beitrag von pierredrks »

Hallo
und danke für die schnelle Hilfe.
Mit String- und DrawGrid hat es leider nicht so funktioniert wie ich es wollte,
also habe ich es jetzt über Canvas gelöst.
Das Herz besitzt Gründe, die die Vernunft nicht kennt.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Und so könntest du auch noch ein Hintergrund Bild einfügen und darauf dein raster zeichnen. Damit tuen sich ja die LCL Komponenten im Moment noch zimlich schwer mit.....

und du hast jetzt auch mehr Freiheiten....
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Mach ja auch wenig sinn.
Stell dir ma vor jeder bastelt applikationen mit irgendwelchen hintergrundbildern dahiner da kann man sich keine einziges programm mehr anschaun sowas ist einfsch unprofessionell.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Für manche Sachen währe das aber Praktisch z.b. für Spiele oder für Multimedia Player oder für ein Info Dialog oder so... muss man es ja nicht übertreiben, aber etwas mehr Grafik währe auch nicht schlecht....
MFG
Michael Springwald

Antworten