ReadString

Zur Vorstellung von Komponenten und Units für Lazarus
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: ReadString

Beitrag von mse »

ruewa hat geschrieben:Was mich an Deinem Konstrukt erheblich mehr stört, ist, daß Du das IniFile in den luftleeren Raum hinein katapultierst! Der Compiler akzeptiert das, aber wo bleibt Dein IniFile, sobald Du den "with ... do"-Block verlassen hast? Wenn Du Deinem IniFile nicht einmal eine Variablendeklaration spendierst, kannst Du es, sobald Du den Block verlassen hast, nie wieder ansprechen! Wie willst Du Dein TIniFile-Objekt denn alleine schon freigeben, selbst wenn Du es hinterher nie mehr brauchen solltest?

Wie von Maik81SE demonstriert so:

Code: Alles auswählen

 
with TIniFile.Create(fFilename) do begin
 try
  Temp:= TStringlist.Create;
  try
   ReadSections(Temp);
...
  finally
   Temp.Free;
  end;
 finally
  Free;
 end;
end;
 

Ich benutze with/do häufig vor allem mit records und um Index Adressierung zu optimieren. Ich wünschte mir zwar, dass Free Pascal eine sichere "with" Variante mit expliziter Referenz hätte. MSElang wird ein ensprechendes Konstrukt aufweisen.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: ReadString

Beitrag von Maik81SE »

ruewa hat geschrieben:Hallo Maik!

Maik81SE hat geschrieben:

Code: Alles auswählen

 
    with TIniFile.Create(fFilename) do ...
 

Okay, als "Teufelszeug" würde ich die "with ... do"-Klammer nicht gleich verurteilen, aber in der Tendenz sehe ich das ähnlich wie die Vorredner. Der Preis für ein kleines bißchen Schreibfaulheit ist eine erhebliche Einschränkung der Klarheit und Lesbarkeit des Codes. Ich benutze "with ... do" selbst nur selten und nur an Stellen, die aus dem Kontext heraus leicht verständlich sind (z.B. in OnCreate-/OnDestroy-Prozeduren). Aber egal.

Was mich an Deinem Konstrukt erheblich mehr stört, ist, daß Du das IniFile in den luftleeren Raum hinein katapultierst! Der Compiler akzeptiert das, aber wo bleibt Dein IniFile, sobald Du den "with ... do"-Block verlassen hast? Wenn Du Deinem IniFile nicht einmal eine Variablendeklaration spendierst, kannst Du es, sobald Du den Block verlassen hast, nie wieder ansprechen! Wie willst Du Dein TIniFile-Objekt denn alleine schon freigeben, selbst wenn Du es hinterher nie mehr brauchen solltest? Das kannst Du so nicht machen, das ist ganz grober Unfug!


Mit anderen Worten du willst Die KOMPLETTE class sehen? Somit ist meine IniFile nicht mehr luftleer, wenn du damit sagen willst, das ich Ihr keinen Nahmen zugewiesen habe ;)

ruewa hat geschrieben:
Maik81SE hat geschrieben:Aber so viel Tam Tam nur um die Grundlegende Frage von euch bestädigt zu bekommen...

Nun, ich habe Dir die Frage klipp und klar beantwortet! Und ich bezweifle, daß Dein Tonfall angemessen ist:
Oder die Tatsache, das ich Sehr Ironisch denke, schreibe und Lebe ;)

Nee... Ich weiß, was du mit deiner Antwort sagen willst... Nur Frag ich mich dann, warum bei der Zeile in meiner IniFile

Code: Alles auswählen

Lfd-Nr.:=6
Bezeichnung=
Klassifizierung=
Version=
Beschaffungsliste=
 
die schleife nicht übersprungen wird, so ich es der Function wünsche.

Gerne würde ich ggf. auf eine MySql gehen, aber da stimmt ihr mir wohl alle zu, wenn ich sage, das mir das 100pro zu hoch ist und ich die Hände davon lasse.

ruewa hat geschrieben:
Maik81SE hat geschrieben:Theo, Ich arbeite schon aus Prinzip mit mit with .. do und da du mir ja so freundlich davon abraten tust... Erst recht.

Nimm's mir nicht übel, aber ich habe den Eindruck, daß Du Deine "Erfahrung" grotesk überschätzst, wenn Du auf derart banale Weise schon am Kleinen Einmaleins der Lazarus-/Pascal-Programmierung strandest! Das ist nichts Ehrenrühriges, jeder von uns hat mal ähnlich tapsig angefangen, aber mit überbordendem Selbstbewußtsein läßt sich das eben nicht aus der Welt reden!

Gruß Rüdiger


Weil Ihr ja jetzt alle So schön auf meine with..do rumreitet, was hier im Kern so garnicht zur Frage steht, Bitte ich ernsthaft um eine Alternative, wie ich diese Angebliche Schreibfaulheit, welche ich Sogar von einem HIER aus dem Forum als Sinnvoller Tipp und Gutes Beispiel bekommen habe, zu vermeiden.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: ReadString

Beitrag von ruewa »

mse hat geschrieben:Wie von Maik81SE demonstriert so:

Code: Alles auswählen

 
with TIniFile.Create(fFilename) do begin
 try
    ...
 finally
  Free;
 end;
end;
 


Hast recht, Martin, das hatte ich übersehen. Okay, dann nehme ich den "groben Unfug" zerknirscht zurück, entschuldigt! :oops: Paßt aber schon wie die Faust aufs Auge zum Thema "Lesbarkeit"...

Wie man das anders, übersichtlicher, machen kann, Maik? Ziemlich einfach:

Code: Alles auswählen

procedure IrgendWas;
var
  IniF : TIniFile;
begin
  IniF := TIniFile.Create;
  try
    String1 := IniF.ReadString(...);
  finally
    IniF.Free;
  end;
end;


Warum ist das sinnvoller? Klar geht beides. Aber der Unterschied ist, daß auf diese Weise in jeder Zeile ziemlich offensichtlich ist, worum es geht. Um Dein anonymes "Free" hingegen zuordnen zu können, muß man irgendwo 20 Zeilen oberhalb nachschauen, worauf es sich denn wohl beziehen könnte. Solange Du an der Routine schreibst, ist Dir das natürlich alles klar. Aber wenn Du ein Jahr später mal was ändern willst oder einen vertrackten Fehler suchst, blickst Du in Deinem eigenen Zeug nicht mehr durch. Und wenn Du das ein paarmal durchgemacht hast, nämlich Dich stirnrunzelnd zu fragen, was Du Dir damals wohl gedacht haben magst, wirst Du Deinen Stil im wohlverstandenen Eigeninteresse in Richtung bestmöglicher Selbsterklärbarkeit ändern.

Und wenn die ersten grauen Haare da sind, wirst Du dann selber raunen: "Teufelszeug!"... :roll:

Aber wie gesagt: Bring als erstes mal Deine Lazarus-Hilfe zum laufen, ohne die kommst Du nicht weit. Siehe http://wiki.freepascal.org/Installing_Help_in_the_IDE

Gruß Rüdiger

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: ReadString

Beitrag von Maik81SE »

Moin Rüdiger,

ruewa hat geschrieben:Aber wenn Du ein Jahr später mal was ändern willst oder einen vertrackten Fehler suchst, blickst Du in Deinem eigenen Zeug nicht mehr durch. Und wenn Du das ein paarmal durchgemacht hast, nämlich Dich stirnrunzelnd zu fragen, was Du Dir damals wohl gedacht haben magst, wirst Du Deinen Stil im wohlverstandenen Eigeninteresse in Richtung bestmöglicher Selbsterklärbarkeit ändern.


Das mit der Fehlersuche, Punkt für dich. Da werd ich den Teufel tun und was dagegen sagen.

In dem Sinne Schönen Sonntag @ll

ich geh jetzt auf Arbeit :D

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Antworten