ReadString

Zur Vorstellung von Komponenten und Units für Lazarus

Re: ReadString

Beitragvon mse » 8. Nov 2014, 13:03 Re: ReadString

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.
mse
 
Beiträge: 1907
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Maik81SE » 8. Nov 2014, 13:14 Re: ReadString

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'
Maik81SE
 
Beiträge: 75
Registriert: 30. Sep 2011, 13:07
Wohnort: Lübeck
OS, Lazarus, FPC: Win7/(en)Debian/Ubuntu 14:10 (L 1.2.4+dfsg-1. FPC 2.6.x) | 
CPU-Target: 64bit; arm; avr
Nach oben

Beitragvon ruewa » 8. Nov 2014, 14:53 Re: ReadString

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
ruewa
 
Beiträge: 153
Registriert: 12. Apr 2014, 13:43

Beitragvon Maik81SE » 8. Nov 2014, 22:28 Re: ReadString

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'
Maik81SE
 
Beiträge: 75
Registriert: 30. Sep 2011, 13:07
Wohnort: Lübeck
OS, Lazarus, FPC: Win7/(en)Debian/Ubuntu 14:10 (L 1.2.4+dfsg-1. FPC 2.6.x) | 
CPU-Target: 64bit; arm; avr
Nach oben

• Themenende •
Vorherige

Zurück zu Units/Komponenten



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried