[gelöst] Frame, Datenmodul und Stringlist

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[gelöst] Frame, Datenmodul und Stringlist

Beitrag von kralle »

Moin,

ich möchte Daten die in einzelnen Frames gesamnelt werden, jeweils in einer Stringliste speichern.
Die Listen möchte ich in einem Datenmodul speichern.
Mein Problem ist, das weder das Frame,noch das Datenmodul ein OnCreate-Event haben.
Würde ich diese Listen im Hauptformular erzeugen, dann müsste ich das Hauptformular in die Uses der Frames eintragen und das obwohl die Frames in der Uses des Hauptformulars stehen.
Wie mache ich das richtig?

Gruß Heiko
Zuletzt geändert von kralle am Sa 19. Mär 2016, 05:55, insgesamt 1-mal geändert.
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von Socke »

kralle hat geschrieben:Mein Problem ist, das weder das Frame,noch das Datenmodul ein OnCreate-Event haben.
Du kannst den Konstruktor und den Destruktor überschreiben.

Du solltest auch in den Projekteinstellungen die Erstellungsreihenfolge der Formulare und Datenmodule anpassen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Hallo Socke,
ist meine Idee eigentlich der richtige Weg oder sollte man das eigentlich ganz anders machen?
Bei einem Frame das OnCreate-Ereignis selber "erzeugen", wurde schon an anderer Stelle erfolglos diskutiert.

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: Frame, Datenmodul und Stringlist

Beitrag von wp_xyz »

kralle hat geschrieben:Bei einem Frame das OnCreate-Ereignis selber "erzeugen"...
Aber wozu unbedingt ein OnCreate-Event? Die Frames und Datamodules, die du verwendest, sind von TFrame und TDataModule abgeleitet; den Constructor kannst du überschreiben, und dort nach dem "inherited" allen Code reinpacken, den du brauchst. OnCreate ist nur eine Prozedur, die vom Vorfahren im (oder nach dem?) Constructor aufgerufen wird:

Code: Alles auswählen

type
  TFrame1 = class(TFrame)
    Edit1: TEdit;
  ...
  public
    constructor Create(AOwner: TComponent); override;
  end;
 
constructor TFrame1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Edit1.Text := 'Dies ist der voreingestellte Text.';
end;

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Frame, Datenmodul und Stringlist

Beitrag von baumina »

Grundproblem ist sicherlich, dass du Daten in der Anzeige (Frame) sammeln willst. Mache eine saubere Trennung von Daten und Anzeige. Datensammeln hat nämlich erst mal gar nichts mit der Anzeige dieser zu tun.
.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Moin, wie mache ich es denn richtig, wenn die Frames lauter Checkboxen und Edit-Felder enthalten und dadurch die Werte erzeugt werden?

Gruß Heiko

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

Re: Frame, Datenmodul und Stringlist

Beitrag von wp_xyz »

Ich weiß natürlich nicht, was du genau machen willst, und es ist schwer bis unmöglich allgemein gültige Regeln aufzustellen.

Aber in meinen (größeren) Projekten gibt es immer eine Unit, in der alle Daten zusammengetragen sind. Mache einen Record mit den Parametern und Ergebnissen der einen Rechnung, einen anderen Record für die Parameter der zweiten, usw. Wenn du ein Formular oder einen Frame öffnest, holst du dir alle benötigten Parameter aus den Records und schreibst sie in die Controls. Wenn der Benutzer mit seinen Eingaben fertig ist, schreibe die Werte aus den Controls zurück in die Records. Arbeite nie mit den Werten der Benutzeroberfläche, betrachte sie als volatil, also nur begrenzt gültig. Die Records kannst du problemlos beim Programmstart, sogar noch bevor irgend ein Formular geladen ist, aus der Ini-Datei laden. Idealerweise hat jedes Formular (Frame) seinen eigenen Datenrecord. Vor langer Zeit, bei Turbo Vision, war das die übliche Möglichkeit, Daten in einen Dialog zu kriegen. Insofern ist Delphi (Lazarus) ein Rückschritt, weil es dem unerfahrenen Benutzer erlaubt, Daten und Benutzeroberfläche nach Belieben zu vermischen.

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

Re: Frame, Datenmodul und Stringlist

Beitrag von Mathias »

Arbeite nie mit den Werten der Benutzeroberfläche, betrachte sie als volatil, also nur begrenzt gültig.
Das kann einen grossen Ratten-Schwanz mitziehen.
Tauscht man zB. ein TButton durch einen TBtnButton aus, kann sich so was durch ganze Programm ziehen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Frame, Datenmodul und Stringlist

Beitrag von wp_xyz »

Du hast nicht verstanden, was ich meine. Ein Button kann doch keine Werte speichern, so wie etwa ein Edit.

Nehmen wir an, in deinem Programm gibt es ein Verzeichnis für Sprachen, es wird in einem Formular TForm2 mit Hilfe eines TDirectoryEdit ausgewählt. Im Hauptformular, TForm1, gibt es eine Combobox mit den verfügbaren Sprachdateien ('language.de', 'language.en', 'language.it', etc). Du brauchst den Pfad zur aktuell ausgewählten Sprachdatei, um per "SetLanguage" die Sprache zu wechseln. In 90% aller Beiträge der Lazarus-Neulinge würde ich folgenden Code lesen:

Code: Alles auswählen

procedure TForm1.Combobox1Select(Sender: TObject);
var
  pfad: String;
begin
  pfad := Form2.DirectoryEdit1.Directory + Combobox1.Text;
  SetLanguage(pfad);
end;
Damit das funktioniert, muss Form2 existieren und geladen sein, und Form1 muss Form2 kennen. Unschön. Im Extremfall muss jedes Formular jedes andere kennen, was evtl nicht mehr compilierbar ist.

Besser: Mache eine zentrale Unit mit Einstellungen ("globals"), hier gibt es eine Variable "LanguageDir", alleinstehend oder als Teil eines Records ist jetzt egal.

Code: Alles auswählen

unit globals;
interface
var
  LanguageDir: String = '';
...
Wenn der User in Form2 das Sprachverzeichnis eingegeben hat, wird der Wert aus DirectoryEdit1 nach "LanguageDir" übertragen.

Code: Alles auswählen

//TForm2 
uses
  globals;
 
procedure TForm2.FormShow(Sender: TObject);  // oder FormCreate, FormActivate, was auch immer passt...
begin
  DirectoryEdit1.Directory := LanguageDir;
end;
 
procedure TForm2.DirectoryEditEditingDone(Sender: TObject);
begin
  LanguageDir := DirectoryEdit1.Directory;
end;
Wenn der Wert später, in TForm1.Combobox1Select gebraucht wird, kannst du "LanguageDir" verwenden, ohne Form2 zu benötigen:

Code: Alles auswählen

//TForm1
uses
  globals;
 
procedure TForm1.Combobox1Select(Sender: TObject);
var
  pfad: String;
begin
  pfad := LanguageDir + Combobox1.Text; 
  SetLanguage(pfad);
end;
So benötigt jedes Formular die zentrale Daten-Unit, aber im Idealfall kein anderes Formular.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Moin,
bei mir sieht das z.B. so aus:
Auf Frame1 gibt es eine checkbox "Spannung".
Wenn die aktiv ist, dann brauche ich in einer Liste das hier:
"Dialog",35,"Spannung",""
deaktiviere ich die checkbox, dann muss die ganze Zeile aus der Liste gelöscht werden.
Wenn alle Frames bearbeitet wurden, müssen alle Listen plus zusätzlich feste Zeilen zusammengefügt werden und mit vorangestellten Zeilennummern versehen werden:
10 "Dialog",35,"Spannung",""
Erzeugt werden die Werte durch Checkboxen, Editfelder und Comboboxen.
Ich lade keine Werte aus einer Datei und zeige sie zum Bearbeiten an.
Beim Programmstart sind alle Listen leer und nur am Ende wird eine ASCII-Datei da raus.

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: Frame, Datenmodul und Stringlist

Beitrag von wp_xyz »

Werden die Frames sukzessive abgearbeitet? Ist jeder Frame autark? D.h. hängt sein Ergebnis nur von Controls ab, die auf diesem Frame platziert sind?

Kannst du vielleicht dein Problem auf zwei/drei Frames zusammenstreichen und hier als kleines Demo-Projekt posten? Ich würde dir ja gerne konkreter helfen, aber mit der Beschreibung allein komme ich nicht klar, so dass ich nur allgemeine Wischi-Waschi-Ratschläge geben kann.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Moin,
wp_xyz hat geschrieben:Kannst du vielleicht dein Problem auf zwei/drei Frames zusammenstreichen und hier als kleines Demo-Projekt posten?
siehe PN.

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Hallo wp_xyz,

danke für Deine Hilfe.

Ich habe jetzt die Initialisierungen wie vorgeschlagen in die Frames verlagert:

Code: Alles auswählen

 
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;  // <-- wp
  end;
 
implementation
 
{$R *.lfm}
 
// wp: Initialisierung im Constructor (Könnte man auch im Object Inspector machen!)
constructor TFrameAllgemein.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  chkCB_Activate_Symbol.Checked:=false;
end;
 
Im Code schreibst Du auch:

Code: Alles auswählen

Könnte man auch im Object Inspector machen!
Also, ich habe im Objektinspektor kein "Create". Hast Du einen anderen oder das irgendwo freigeschaltet?

Das DatenModul als solches habe ich wie vorgeschlagen rausgeworfen und durch eine einfache Unit ersetzt.

In der Unit gibt es diese Zeile:

Code: Alles auswählen

{%CLASSGROUP 'Vcl.Controls.TControl'}
Weiß Du was die soll? Ich habe sie auch in meiner Vorlage gefunden und weiß nicht woher sie kommt? Und wofür die gut ist?

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: Frame, Datenmodul und Stringlist

Beitrag von wp_xyz »

kralle hat geschrieben: Im Code schreibst Du auch:

Code: Alles auswählen

Könnte man auch im Object Inspector machen!
Also, ich habe im Objektinspektor kein "Create". Hast Du einen anderen oder das irgendwo freigeschaltet?
Es handelt sich da um die Eigenschaft "Checked" einer Checkbox. Falls die beim Programmstart gesetzt sein soll oder nicht, kannst du im Objectinspector das Häkchen bei "Checked" setzen bzw. löschen. Der Wert wird dann in der lfm-Datei gespeichert und später nach dem laden des Formulars/Frames entspreched verwendet. Siehe auch: http://wiki.lazarus.freepascal.org/TCheckBox/de

Noch ein Wort zur Initialisierung: wenn die Checkbox beim Programmstart nicht markiert sein soll (Checked = false), dann musst du dich darum gar nicht kümmern, das ist standardmäßig so gesetzt. Nur wenn Checked true sein soll, musst du das Häkchen im Objektinspector setzen (bzw. Initialisierungscode schreiben). Ähnlich bei TEdit: Text ist standardmäßig immer ein Leerstring, nur wenn beim Start ein bestimmter Text eingetragen sein soll, musst du das per Objectinspector/Code erledigen. Um diese Defaultinitialisierungen kümmert sich die IDE.
kralle hat geschrieben: In der Unit gibt es diese Zeile:

Code: Alles auswählen

{%CLASSGROUP 'Vcl.Controls.TControl'}
Weiß Du was die soll? Ich habe sie auch in meiner Vorlage gefunden und weiß nicht woher sie kommt? Und wofür die gut ist?
Habe ich in Lazarus noch nie gesehen. "Vcl.Controls" klingt nach Delphi. Gab es das Programm früher schon mal als Delphi-Version, aus der sich das im Lazarus-Formular eingeschlichen haben könnte?

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1200
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Frame, Datenmodul und Stringlist

Beitrag von kralle »

Moin,
wp_xyz hat geschrieben: Es handelt sich da um die Eigenschaft "Checked" einer Checkbox.
Ach so, dann habe ich den Kommentar falsch verstanden.
wp_xyz hat geschrieben:Noch ein Wort zur Initialisierung: wenn die Checkbox beim Programmstart nicht markiert sein soll (Checked = false), dann musst du dich darum gar nicht kümmern, das ist standardmäßig so gesetzt.
Nachteil, wenn Du den Code später anschaust, weißt du dann noch das Du die Eigenschaft im Objektinspektor gesetzt hast?
wp_xyz hat geschrieben:
kralle hat geschrieben:

Code: Alles auswählen

{%CLASSGROUP 'Vcl.Controls.TControl'}
Weiß Du was die soll? Ich habe sie auch in meiner Vorlage gefunden und weiß nicht woher sie kommt? Und wofür die gut ist?Habe ich in Lazarus noch nie gesehen. "Vcl.Controls" klingt nach Delphi. Gab es das Programm früher schon mal als Delphi-Version, aus der sich das im Lazarus-Formular eingeschlichen haben könnte?
Jupp. Dann kann ich das ja rauswerfen.

Danke, Euch allen für Eure Hilfe.
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Antworten