Komponente zur Laufzeit erzeugen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Saimenn
Beiträge: 2
Registriert: Mi 1. Jul 2020, 20:58

Komponente zur Laufzeit erzeugen

Beitrag von Saimenn »

Hallo,
ich bin hier neu mit einer ganz speziellen Frage.
Ich habe früher viel TurboPascal programmiert, das dann aufgegeben, und jetzt mit Lazarus wieder angefangen. Eigentlich hatte ich gedacht, das Konzept der Objektorientierung bereits verstanden zu haben und mich deswegen an den Aufbau einer eigenen Klasse basierend auf dem TStringGrid gemacht. Nur leider wird das Stringgrid nicht angezeigt, und ich finde meinen Fehler einfach nicht - und ich habe jetzt schon einige Varianten ausprobiert:

Code: Alles auswählen

unit tabelle;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Grids;

type
  ttabelle = class (tstringgrid)
  private
  public
    constructor anlegen(x,y:word;Vater:TComponent);
  end;

implementation

constructor ttabelle.anlegen(x,y:word;AOwner:TComponent);
BEGIN
 { with tstringgrid(AOwner) do
  BEGIN
    Create(Vater);
    Parent:=Self;
    Left:=x;
    Top:=y;
    Width:=100;
    Height:=100;
    ColCount:=10;
    RowCount:=10;
    visible:=true;
  END;    }
    inherited Create(AOwner);
    self.Left:=x;
    self.Top:=y;
    self.Width:=100;
    self.Height:=100;
    self.ColCount:=10;
    self.RowCount:=10;
    self.visible:=true;
END;

end.
und als Aufruf:

Code: Alles auswählen

unit test;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, tabelle;

type

  { TForm1 }

  TForm1 = class(TForm)
    tab1: ttabelle;
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  tab1.anlegen(20,20,Form1);
end;

end.


Kann mir bitte jemand helfen, wo mein Denkfehler ist?
Herzlichen Dank im Voraus!
Saimenn

braunbär
Beiträge: 294
Registriert: Do 8. Jun 2017, 18:21

Re: Komponente zur Laufzeit erzeugen

Beitrag von braunbär »

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  tab1:=ttabelle.anlegen(20,20,self);
end;

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 598
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Komponente zur Laufzeit erzeugen

Beitrag von fliegermichl »

Also zum einen sollte sich das so gar nicht compilieren lassen. Bei der Definition heisst der Parameter "Vater" bei der Implementation dann "aOwner"

Der eigentliche Fehler liegt aber daran, daß "Parent" nicht zugewiesen wurde.
Beim erzeugen der Komponente musst du also:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  tab1:=ttabelle.anlegen(20,20,self);
  tab1.Parent := self;
end;

wp_xyz
Beiträge: 3269
Registriert: Fr 8. Apr 2011, 09:01

Re: Komponente zur Laufzeit erzeugen

Beitrag von wp_xyz »

Saimenn hat geschrieben:
Mi 1. Jul 2020, 21:09
Ich habe früher viel TurboPascal programmiert, das dann aufgegeben, und jetzt mit Lazarus wieder angefangen. Eigentlich hatte ich gedacht, das Konzept der Objektorientierung bereits verstanden zu haben und mich deswegen an den Aufbau einer eigenen Klasse basierend auf dem TStringGrid gemacht.
Ich habe das Gefühl, du bist mental noch darin gefangen, wie man damals mit TP oder TurboVision programmiert hat. Mit Delphi/Lazarus ist das an einigen Stellen ganz anders, und einfacher. Z.B. findest du in Lazarus ganz oben die Komponentenpalette. Klicke Seite "Additional" an, und da findest du als fünft-letztes Icon das TStringGrid. Klicke es an und klicke dann im Formular (falls du es nicht siehst, drücke F12) an der Stelle, an der sich das StringGrid befinden soll - und schon ist das Grid auf dem Formular, ohne eine Zeile zu schreiben. Auch die nötigen Units werden automatisch in die "uses" Zeile geschrieben. Links im Objektinspektor werden die Eigenschaften des Grids angezeigt, und du kannst mit ColCount und RowCount die Anzahl der Spalten und Zeilen festlegen. Mit einem Doppelklick auf dem Grid kannst du dann feststehenden Text, z.B. für die Zeilen- und Spalten-Header schon mal eingeben.

Es lohnt sich nicht, nur für die Festlegung der Spalten- und Zeilenzahl eine eigene Klasse zu schreiben.

Such mal nach "Lazarus Video-Tutorial" - da findest du sicher etwas, was beim Einstieg hilft.

Winni
Beiträge: 271
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Komponente zur Laufzeit erzeugen

Beitrag von Winni »

Hi1

Die Einführung in das TStringGrid ist zwar mager und english, aber zum Starten durchaus geeignet:

https://wiki.lazarus.freepascal.org/TStringGrid

Winni

Saimenn
Beiträge: 2
Registriert: Mi 1. Jul 2020, 20:58

Re: Komponente zur Laufzeit erzeugen

Beitrag von Saimenn »

Vielen Dank für all die Antworten. Das war die Lösung, mit

Code: Alles auswählen

tab1:=ttabelle.anlegen()
funktioniert es wunderbar! Diese Form hatte ich mal gelesen, aber absolut nicht auf dem Schirm. Jetzt kann's endlich weitergehen.

Fliegermichi, mit dem anderen Punkt hast Du natürlich auch recht: Der Text würde sich so nicht kompilieren lassen.
Ich habe den Source Code auf das Wesentliche um mein Problem herum reduziert, und dabei ist mir dieser Bezeichner offensichtlich ein klein wenig durcheinander geraten...

Nochmals vielen Dank!!!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4182
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Komponente zur Laufzeit erzeugen

Beitrag von af0815 »

Ein Hinweis aus der Praxis, bleib bei den gewöhnlich verwendeten Namen für Constructoren (Create) und Destructoren (Destroy) das erspart langfristig viel Zeit beim Suchen nach Fehlern. Es gibt gewisse (tw. ungeschrieben) Konventionen und das meist aus guten Grund.

Über die Formen, wie man ein Objekt anlegt, gibt es (noch) kleine Unterschiede zwischen TP, Delphi und Lazarus. Du bist über so einen gestolpert. Weiters muss man bei Lazarus auch noch aufpassen, welchen Dialekt (mode Kommando) man verwendet. Es ändert sich die Syntax je nach Mode (Delphi, ObjFPC,...) siehe auch https://wiki.freepascal.org/Compiler_Mode/de (die englische Version ist ausführlicher) .
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 4904
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Komponente zur Laufzeit erzeugen

Beitrag von Mathias »

Ein Hinweis aus der Praxis, bleib bei den gewöhnlich verwendeten Namen für Constructoren (Create) und Destructoren (Destroy) das erspart langfristig viel Zeit beim Suchen nach Fehlern. Es gibt gewisse (tw. ungeschrieben) Konventionen und das meist aus guten Grund.
Bei Klassischen Objekten, würde ich Init und Done verwenden.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten