[gelöst] Frame, Datenmodul und Stringlist
- 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
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
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
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
-
- 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
Du kannst den Konstruktor und den Destruktor überschreiben.kralle hat geschrieben:Mein Problem ist, das weder das Frame,noch das Datenmodul ein OnCreate-Event haben.
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- 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
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
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
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
Re: Frame, Datenmodul und Stringlist
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:kralle hat geschrieben:Bei einem Frame das OnCreate-Ereignis selber "erzeugen"...
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;
-
- 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
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.
.
- 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
Moin, wie mache ich es denn richtig, wenn die Frames lauter Checkboxen und Edit-Felder enthalten und dadurch die Werte erzeugt werden?
Gruß Heiko
Gruß Heiko
Re: Frame, Datenmodul und Stringlist
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.
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.
-
- 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
Das kann einen grossen Ratten-Schwanz mitziehen.Arbeite nie mit den Werten der Benutzeroberfläche, betrachte sie als volatil, also nur begrenzt gültig.
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
Mit Java und C/C++ sehe ich rot
Re: Frame, Datenmodul und Stringlist
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:
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.
Wenn der User in Form2 das Sprachverzeichnis eingegeben hat, wird der Wert aus DirectoryEdit1 nach "LanguageDir" übertragen.
Wenn der Wert später, in TForm1.Combobox1Select gebraucht wird, kannst du "LanguageDir" verwenden, ohne Form2 zu benötigen:
So benötigt jedes Formular die zentrale Daten-Unit, aber im Idealfall kein anderes Formular.
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;
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 = '';
...
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;
Code: Alles auswählen
//TForm1
uses
globals;
procedure TForm1.Combobox1Select(Sender: TObject);
var
pfad: String;
begin
pfad := LanguageDir + Combobox1.Text;
SetLanguage(pfad);
end;
- 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
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
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
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
Re: Frame, Datenmodul und Stringlist
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.
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.
- 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
Moin,
Gruß Heiko
siehe PN.wp_xyz hat geschrieben:Kannst du vielleicht dein Problem auf zwei/drei Frames zusammenstreichen und hier als kleines Demo-Projekt posten?
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
- 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
Hallo wp_xyz,
danke für Deine Hilfe.
Ich habe jetzt die Initialisierungen wie vorgeschlagen in die Frames verlagert:
Im Code schreibst Du auch:
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:
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
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;
Code: Alles auswählen
Könnte man auch im Object Inspector machen!
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'}
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
Re: Frame, Datenmodul und Stringlist
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/dekralle hat geschrieben: Im Code schreibst Du auch:Also, ich habe im Objektinspektor kein "Create". Hast Du einen anderen oder das irgendwo freigeschaltet?Code: Alles auswählen
Könnte man auch im Object Inspector machen!
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.
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?kralle hat geschrieben: In der Unit gibt es diese Zeile: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?Code: Alles auswählen
{%CLASSGROUP 'Vcl.Controls.TControl'}
- 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
Moin,
Danke, Euch allen für Eure Hilfe.
Gruß Heiko
Ach so, dann habe ich den Kommentar falsch verstanden.wp_xyz hat geschrieben: Es handelt sich da um die Eigenschaft "Checked" einer Checkbox.
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: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.
Jupp. Dann kann ich das ja rauswerfen.wp_xyz hat geschrieben:kralle hat geschrieben: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?Code: Alles auswählen
{%CLASSGROUP 'Vcl.Controls.TControl'}
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
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1