Das hat auch unabhängig von Delphi-Kompatibilität seinen Sinn, da die Idee ist, dass Klassen innerhalb einer Unit stark miteinander verbunden sein dürfen und sie damit auch auf die Interna ihrer Nachbarn zugreifen dürfen. Und seit einiger Zeit gibt's ja strict private, die das dennoch nicht wollen...fliegermichl hat geschrieben: Di 25. Okt 2022, 23:29 oder das auf private Felder anders als in anderen Programmiersprachen aus Klassen der gleichen Unit zugegriffen werden kann. (Was ich übrigens für einen Fehler halte, da war wieder die Delphi Kompatibilitätskuh am Werk)
Datensätze aus einer Datei löschen
-
- Beiträge: 954
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Datensätze aus einer Datei löschen
FPC Compiler Entwickler
Re: Datensätze aus einer Datei löschen
Naja, das gehört immerhin zur OOP dazu und ist ja nicht ganz unwichtig. Das gibt es ja auch in den meisten anderen Sprachen (C++, PHP,...)fliegermichl hat geschrieben: Di 25. Okt 2022, 23:29 Was soll ein Anfänger mit "Sichtbarkeit von Feldern und Methoden" anfangen?
Die Frage "Was soll ein Anfänger mit..." kann man immer stellen.

Was soll ein Anfänger mit Stack und Heap?
Für das Verständnis von OOP auf Einführungslevel ist das mMn keine notwendige Voraussetzung.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Datensätze aus einer Datei löschen
Ja natürlich gehört das zum OOP Design und muß auch vermittelt werden.
Aber ich finde, daß man das nicht gleich am Anfang machen sollte.
Aber ich finde, daß man das nicht gleich am Anfang machen sollte.
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Filestream
Hallo Theo; eigentlich wollte ich zunächst Funktionen mit Dateien lernen - na gut; das muß ich wohl nach hinten schieben und fange mit Filestream an.
Folgende Fragen:
1: Ich suche in Deinem Entwurt die Stelle, wo das Formular generiert und dargestellt wird - passiert das bei der Stelle
"TGrpSatzListGen = specialize TFpgList<TGrpSatz>;"?
2.An der Stelle
MyList := TGrpSatzList.Create;
//Von Datei laden
MyList.LoadFromFile('Gruppen.dat');
//Den zweiten Eintrag löschen.
MyList.Delete(1);
müßte es doch nach meinen bescheidenen Kenntnissen so sein, daß immer der jeweils 2. Satz gelöscht wird (bis zum Schluß noch einer da ist)
Das scheint aber anders zu laufen; von den 3 Sätzen werden immer 2 angezeigt.... Wo denke ich da falsch?
Vielen Dank
Folgende Fragen:
1: Ich suche in Deinem Entwurt die Stelle, wo das Formular generiert und dargestellt wird - passiert das bei der Stelle
"TGrpSatzListGen = specialize TFpgList<TGrpSatz>;"?
2.An der Stelle
MyList := TGrpSatzList.Create;
//Von Datei laden
MyList.LoadFromFile('Gruppen.dat');
//Den zweiten Eintrag löschen.
MyList.Delete(1);
müßte es doch nach meinen bescheidenen Kenntnissen so sein, daß immer der jeweils 2. Satz gelöscht wird (bis zum Schluß noch einer da ist)
Das scheint aber anders zu laufen; von den 3 Sätzen werden immer 2 angezeigt.... Wo denke ich da falsch?
Vielen Dank
Re: Filestream
1. Nein, das hat mit dem Formular nichts zu tun. Das Hauptformular wird immer in der .lpr Datei erstellt bei:
Darum musst du dich aber jetzt nicht kümmern.
Das macht nur, dass du einen Listentyp bekommst vom Typ deines Records.
Das musst du noch nicht so genau verstehen, aber es macht die Dinge für dich einfacher.
Für die Anwendung ist im ersten Schritt nur der Code in Button1Click für dich wichtig.
Dort gibt es der Einfachheit des Beispiels halber, einen Teil oberhalb der Sternchenlinie und einen Teil unterhalb.
Eigentlich sind das zwei verschiedene Funktionsschritte.
Oberhalb wird eine TGrpSatzList erzeugt (MyList := TGrpSatzList.Create) mit Demo-Records befüllt (MyList.Add) und mit SaveToFile gespeichert.
Dann wird die Liste mit Free wieder freigegeben.
Damit ist dieser Teil abgeschlossen.
Beim Code unterhalb der Sternchenlinie wird auch wieder ein TGrpSatzList erzeugt, dann werden die zuvor gespeicherten Daten mit LoadFromFile eingelesen.
Dann wird das zweite Element gelöscht (Delete) und die ListView befüllt mit den restlichen Daten (for AGrpSatz in MyList do...).
Am Ende wird auch diese Liste mit Free wieder freigegeben.
Diese geänderte Liste wird nicht gespeichert.
Darum und weil die Datei im ersten Schritt immer neu befüllt wird, sind es immer gleich viel (Deine Frage Nr 2.).
Wenn du vor dem Free wieder MyList.SaveToFile('testfile.dat') machst, würde sie gespeichert.
Du könntest nun als erste Fingerübung, den Code unterhalb der Sternchen in das OnClick Ereignis eines zweiten Buttons verschieben.
Dann hast du Schreiben und Lesen getrennt und kannst ausprobieren, was passiert.
Als zweiten Schritt könntest du die Liste (MyList: TGrpSatzList) als Feld der Klasse deklarieren und in FormCreate erstellen / FormDestroy freigegen, statt in Button1Click.
Dann hättest du eine Liste, die du von überall her zugreifen kannst. Etwa so:
Du musst nicht gleich alles in der Tiefe verstehen, versuche zuerst einmal, das in Button1Click Gegebene anzuwenden.
Es ist auch ein Vorteil der modularen/objektorientierten Programmierung, dass man Code-Teile als "Black Box" verwenden kann, ohne sich in jedem Fall kümmern zu müssen, wie sie genau funktionieren.
Code: Alles auswählen
Application.CreateForm(TForm1, Form1);
Code: Alles auswählen
TGrpSatzListGen = specialize TFpgList<TGrpSatz>;
Das musst du noch nicht so genau verstehen, aber es macht die Dinge für dich einfacher.
Für die Anwendung ist im ersten Schritt nur der Code in Button1Click für dich wichtig.
Dort gibt es der Einfachheit des Beispiels halber, einen Teil oberhalb der Sternchenlinie und einen Teil unterhalb.
Eigentlich sind das zwei verschiedene Funktionsschritte.
Oberhalb wird eine TGrpSatzList erzeugt (MyList := TGrpSatzList.Create) mit Demo-Records befüllt (MyList.Add) und mit SaveToFile gespeichert.
Dann wird die Liste mit Free wieder freigegeben.
Damit ist dieser Teil abgeschlossen.
Beim Code unterhalb der Sternchenlinie wird auch wieder ein TGrpSatzList erzeugt, dann werden die zuvor gespeicherten Daten mit LoadFromFile eingelesen.
Dann wird das zweite Element gelöscht (Delete) und die ListView befüllt mit den restlichen Daten (for AGrpSatz in MyList do...).
Am Ende wird auch diese Liste mit Free wieder freigegeben.
Diese geänderte Liste wird nicht gespeichert.
Darum und weil die Datei im ersten Schritt immer neu befüllt wird, sind es immer gleich viel (Deine Frage Nr 2.).
Wenn du vor dem Free wieder MyList.SaveToFile('testfile.dat') machst, würde sie gespeichert.
Du könntest nun als erste Fingerübung, den Code unterhalb der Sternchen in das OnClick Ereignis eines zweiten Buttons verschieben.
Dann hast du Schreiben und Lesen getrennt und kannst ausprobieren, was passiert.
Als zweiten Schritt könntest du die Liste (MyList: TGrpSatzList) als Feld der Klasse deklarieren und in FormCreate erstellen / FormDestroy freigegen, statt in Button1Click.
Dann hättest du eine Liste, die du von überall her zugreifen kannst. Etwa so:
Code: Alles auswählen
TForm1 = class(TForm)
....
private
fMyList: TGrpSatzList;
public
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fMyList := TGrpSatzList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
fMyList.free;
end;
Es ist auch ein Vorteil der modularen/objektorientierten Programmierung, dass man Code-Teile als "Black Box" verwenden kann, ohne sich in jedem Fall kümmern zu müssen, wie sie genau funktionieren.
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Datensätze aus einer Datei löschen
Danke theo, das hat mir wirklich geholfen. Es gibt da ganz sicher unbeleuchtete Ecken aber ich komme ein Stück besser damit zurecht
Vielleicht finde ich den Filestream bald richtig gut......

Vielleicht finde ich den Filestream bald richtig gut......
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Datensätze aus einer Datei löschen
Hallo Theo, wenn ich den Vorschlag so stumpf abschreibe (mehr kann ich leider nicht) gibt es Fehlermeldungen (Die beiden Proceduren stehen in der Implementation; vielleicht ist das ja falsch) - es wird ein "method identifier expected"
Re: Datensätze aus einer Datei löschen
Das sind Ereignisse des Formulars, welche du einhängen musst. OnCreate / OnDestroy
Vielleicht solltest du zuerst die Grundlagen noch etwas vertiefen?
z.B. mit Videos?
https://wiki.freepascal.org/Lazarus_videos
https://wiki.freepascal.org/Lazarus_Documentation
Vielleicht solltest du zuerst die Grundlagen noch etwas vertiefen?
z.B. mit Videos?
https://wiki.freepascal.org/Lazarus_videos
https://wiki.freepascal.org/Lazarus_Documentation
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Datensätze aus einer Datei löschen
Hallo Theo,
im Entwurf des FileStream wurde beim Lesen eine Umwandlung in einen String vorgenommen (ListItem.Caption:=AGrpSatz.GrpNr.ToString;). In meinem Record gibt es ein Feld vom Typ "currency"; hier ist wohl auch eine Umwandlung nötig - habe nur keine gefunden bzw. sehe keine in der sich aufklappenden Liste. Wir muß ich den denn behandeln?
Gruß (geht sonst schon alles besser)
im Entwurf des FileStream wurde beim Lesen eine Umwandlung in einen String vorgenommen (ListItem.Caption:=AGrpSatz.GrpNr.ToString;). In meinem Record gibt es ein Feld vom Typ "currency"; hier ist wohl auch eine Umwandlung nötig - habe nur keine gefunden bzw. sehe keine in der sich aufklappenden Liste. Wir muß ich den denn behandeln?
Gruß (geht sonst schon alles besser)
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Datensätze aus einer Datei löschen
currency ist ein eigentümlicher Typ
https://wiki.freepascal.org/Currency mit CurrToStr und StrToCurr sollte der umzuwandeln sein. Es ist ein Ganzzahltyp mit genau 4 Kommastellen.

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Datensätze aus einer Datei löschen
Hallo af0815; das hatte ich auch schon probiert; werde aber leider mit "illegal qaulifier" angemault.....
Muß irgenwie anders gehen, weil im angeführten Beispiel auch nur mit "....toString" gearbeitet wird. Ggf. muß ich dem Recordfeld einen anderen Typ zuweisen.
Muß irgenwie anders gehen, weil im angeführten Beispiel auch nur mit "....toString" gearbeitet wird. Ggf. muß ich dem Recordfeld einen anderen Typ zuweisen.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Datensätze aus einer Datei löschen
Hi!
Currency ist ein widerspenstiges Biest.
Am Besten seit Turbo-Pascal-Zeiten:
Mit Fliesskomma-Zahlen rechnen und im allerletzten Moment auf Cent runden.
Die genaueste Fliesskomma-Darstellung ist zur Zeit extended.
Winni
Currency ist ein widerspenstiges Biest.
Am Besten seit Turbo-Pascal-Zeiten:
Mit Fliesskomma-Zahlen rechnen und im allerletzten Moment auf Cent runden.
Die genaueste Fliesskomma-Darstellung ist zur Zeit extended.
Winni
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Datensätze aus einer Datei löschen
Die Frage ist einmal, warum brauchst du currency. Was soll damit gespeichert werden ?
Für Currency gibt es halt nicht all bequemen Überladungen bzw. Helper. Das liegt in der Sache, weil currency ein wenig gebrauchter Spezialtyp ist.
Für Currency gibt es halt nicht all bequemen Überladungen bzw. Helper. Das liegt in der Sache, weil currency ein wenig gebrauchter Spezialtyp ist.
Zuletzt geändert von af0815 am Do 3. Nov 2022, 19:19, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Datensätze aus einer Datei löschen
Du musst es so machen:Joachim Raap hat geschrieben: Do 3. Nov 2022, 19:06 Hallo af0815; das hatte ich auch schon probiert; werde aber leider mit "illegal qaulifier" angemault.....
Muß irgenwie anders gehen, weil im angeführten Beispiel auch nur mit "....toString" gearbeitet wird. Ggf. muß ich dem Recordfeld einen anderen Typ zuweisen.
Code: Alles auswählen
ListItem.SubItems.Add(CurrToStr(AGrpSatz.GrpJahrUms));
Man könnte sich aber einen bauen:
Code: Alles auswählen
{$modeswitch TypeHelpers}
...
{ TCurrencyHelper }
TCurrencyHelper = Type Helper for Currency
Public
Function ToString: string; overload; inline;
end;
...
function TCurrencyHelper.ToString: string;
begin
Result:=CurrToStr(Self);
end;
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37