Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Ini-Wert nicht als string einfügen (https://www.delphipraxis.net/179348-ini-wert-nicht-als-string-einfuegen.html)

Erutan 28. Feb 2014 23:08

Delphi-Version: 5

Ini-Wert nicht als string einfügen
 
Hallo,

ich habe ein Problem mit dem Einlesen eines Ini-Wertes.

Um ein Webformular auszufüllen soll das Programm die Daten aus einer Ini-Datei holen. Macht es auch...allerdings in einem Fall etwas anders als gewollt.

Meine Ini sieht in dem relevanten Beeich folgendermaßen aus:

Delphi-Quellcode:
[OpenPR]
URL=http://www.openpr.de/news/einstellen.html
F1N=name
F1W=EditVorname.Text + ' ' + EditNachname.Text
F2N=email
F2W=EditEmail.Text
Die Edit-Felder EditVrname und EditNachname enthalten die entsprechenden Daten.
Würde ich das nun (wie bisher) statisch machen, würde ich sagen:

Delphi-Quellcode:
Webbrowser1.Navigate('http://www.openpr.de/news/einstellen.html');
Um das dynamisch zu machen, sage ich nun aber

Delphi-Quellcode:
Webbrowser1.Navigate(Ini.ReadString(ComboBoxPresseverteiler.Text, 'URL', ''));
Das klappt auch einwandfrei.

Nun will ich die Felder (erst einmal nur das erste) ausfüllen lassen.
Statisch würde ich bei Webbrowser1DocumentComplete sagen:

Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('name')).value := EditVorname.Text + ' ' + EditNachname.Text;
Nun will ich die Werte aber aus der Ini ziehen. Dazu habe ich folgendes geschrieben:

Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item(Ini.ReadString(ComboBoxPresseverteiler.Text, 'F1N', '')).value := Ini.ReadString(ComboBoxPresseverteiler.Text, 'F1W', '');
Der erste Teil klappt, d.h. es wird das richtige Forlularfeld eigetragen. Der zweite Teil klappt aber leider nicht. Es werden nicht die Inhalte von EditVorname und EditNachname eingetragen, sondern es wird genau das wortwörtlich eingetragen was in der ini steht, nämlich EditVorname.Text + ' ' + EditNachname.Text.

Ist auch eigentlich klar, denn der Code steht zwischen zwei Hochkommas und sollt also wie er ist verwendet werden. Wenn ich die Hochkommas allerdings entferne, meckert der Compiler.

Gibt's nen Weg um das Problem zu lösen? Oder muß ich erst alle Werte aus der Ini in Variablen schreiben und dann die Variablen einfügen?

Grüße
Holger

Edit: Die Werte aus der Ini vorher in eine Variable einfügen habe ich gerade erfolglos probiert. Geht leider auch nicht. Mit Ini.ReadInteger geht's auch nicht. Hmmm....

Volker Z. 1. Mär 2014 00:10

AW: Ini-Wert nicht als string einfügen
 
Hallo,

Zitat:

[...] Es werden nicht die Inhalte von EditVorname und EditNachname eingetragen, sondern es wird genau das wortwörtlich eingetragen [...]
Naja, das ist schon richtig so. Du liest ja mit ReadString den entsprechenden Wert aus der INI-Datei ein, und da steht halt nun mal EditVorname.Text + ' ' + EditNachname.Text auch so als Text drin.

Zitat:

[...] Ist auch eigentlich klar, denn der Code steht zwischen zwei Hochkommas [...]
Was meinst Du damit? Das F1W in Deinem Aufruf von ReadString? Das ist doch nur ein Bezeichner für den entsprechenden Schlüssel Deiner INI-Datei - und der muss in einfachen Hochkommata stehen.

Zitat:

[...] Gibt's nen Weg um das Problem zu lösen? Oder muß ich [...]
Das kannst Du so nicht ohne Weiteres in einer INI-Datei ablegen, denn dort kannst Du keine Referenz auf Deine Programmkomponenten speichern, sondern "nur Text". Du kannst zwar Deinen Weg weitergehen, das heißt aber dann Du musst den Text parsen und programmtechnisch entsprechend umsetzen - das könnte aber eine gewaltige Aufgabe werden.

Ich kenne jetzt Deine Anforderungen nicht, daher kann nur soviel: Schreib Dir die nötigen Funktionen (z. B. setze Vorname und Nachname zusammen),
Delphi-Quellcode:
function ConcatGivenAndFamilyName : string;
begin
  Result := EditVorname.Text + ' ' + EditNachname.Text
end;
in der INI steht dann z. B. F1W=1 und irgendwo in Deinem Programm
Delphi-Quellcode:
case Ini.ReadInteger (Section, 'F1W', 0) of
  1 : WebBrowser1.(...).value := ConcatGivenAndFamilyName;
end
Ich hoffe es ist soweit verständlich. Vielleicht hilft' s.

Gruß

Sir Rufo 1. Mär 2014 00:27

AW: Ini-Wert nicht als string einfügen
 
Nun ja, es gibt da auch noch die Möglichkeit von "Variablen" wie diese auch in der Delphi IDE benutzt werden.
Code:
F1W=$(vorname) $(nachname)
Den Text parsen, den Variablennamen bestimmen und dann durch den jeweiligen Wert ersetzen.

Popov 1. Mär 2014 00:31

AW: Ini-Wert nicht als string einfügen
 
Unabhängig des Problems, meiner Kenntnis nach ist das keine gute Idee:
Code:
[OpenPR]
URL=http://www.openpr.de/news/einstellen.html
Kann sein, dass es inzwischen anders ist, aber als ich das letzten mal die Länge einer Ini Zeile testete, war die etwa 1024 Zeichen lang. Internetadressen können gelegentlich länger sein.

Kann aber auch sein, dass die Beschränkung inzwischen weg ist.

Sir Rufo 1. Mär 2014 00:42

AW: Ini-Wert nicht als string einfügen
 
@Popov

Generell ist es eh nicht ratsam den Code so direkt ineinander zu weben.
Ein bischen mehr Abstraktion und das Problem von morgen (Beschränkung der Ini-Datei wird relevant) ist spätestens übermorgen gelöst (statt INI jetzt ClientDataSet) und der Rest bekommt das gar nicht mit, weil egal

Erutan 1. Mär 2014 01:17

AW: Ini-Wert nicht als string einfügen
 
Boaahh...alles Nachtarbeiter :-)

@Volker
Vielen Dank. Ja, ist verständlich bzw. habe ich kappiert. Falls es aber irgendeinen anderen Weg gibt, dann wäre das superklassetoll, denn es sind insgesamt 20 Felder mit jeweils 20 Werten. Ich müsste also 400 Werte ändern.

@Sir Rufo
Zitat:

Nun ja, es gibt da auch noch die Möglichkeit von "Variablen" wie diese auch in der Delphi IDE benutzt werden.
markieren
Code:
F1W=$(vorname) $(nachname)
Den Text parsen, den Variablennamen bestimmen und dann durch den jeweiligen Wert ersetzen.
Ich habe leider keine Idee wie ich das umsetzen soll. Kannst Du mir ein Beispiel geben?

Zitat:

Generell ist es eh nicht ratsam den Code so direkt ineinander zu weben.
Hihi, wenn Du wüßtest welche seltsamen Umwege ich manchmal mangels ausreichender Programmierkenntnisse gehen muss.

Die Werte zu den eizelnen Feldern gelangen z.B. in die Ini indem ich hinter einer ComboBox die Captions (unsichtbarer) Labels bei einem OnChange-Ereignis ändere. Also: Ich trage in ein Editfeld F1 ein, daß das entsprechende Formularfeld "name" heißt und wähle dahinter in einer ComboboxF1 aus, daß es sich um Vor- und Zunamen handelt. Dadurch wird die Caption eines dahinter liegenden Labels entsprechend geändert und dieser Wert wird dann in die Ini gespeichert.

...und ich bin total stolz, daß mir diese ösung eingefallen ist :-)

Grüße
Hoger

Volker Z. 1. Mär 2014 02:29

AW: Ini-Wert nicht als string einfügen
 
Hallo,

ich habe leider immer noch ein Problem, Dein Problem zu verstehen.

So wie ich es sehe: Du möchtest verschiedene URLs automatisiert aufrufen, die möglichen Eingabefelder aus einer INI-Datei füttern und letztlich das Form abschießen - soweit korrekt?. Dabei sind die Daten eigentlich immer die selben oder? (Dein Name, Deine eMail-Adresse ändert sich nicht) nur die unterschiedlichen Anbieter verlangen mal mehr mal weniger Info/Daten (soweit korrekt?). Wenn dem so ist, dann die entsprechenden Daten in der INI ablegen (z. B. in der Section z. B. http://openpr.de/news/einstellen.html) und bei Bedarf entsprechend auslesen und den zugehörigen Controls (TEdit what so ever) zuweisen.
Code:
[http://openpr.de/news/einstellen.html]
F1N=name
F1W=Michel aus Lönneberga
F2N=email
F2W=michel@loenneberga.sw
Code:
[http://iregendeineandereseite.html]
F1N=somename
F1W=Michel Swenson
F2N=mailto
F2W=michel@loenneberga.sw
Soweit noch verständlich?

Gruß

Erutan 1. Mär 2014 02:49

AW: Ini-Wert nicht als string einfügen
 
Hi Volker,

ich verstehe was Du meinst.
Geht aber leider nicht.

Ich schreibe Pressemitteilungen nicht nur für mich, sondern auch noch für 2 Vereine. Die Kontaktdaten sind jeweils andere. Daher kann ich die nicht fest in einer Ini ablegen. Ganz zu schweigen von den Texten, die sich ja auch ändern.

Das Problem hast Du genau erwischt. Manche Presseverteiler wollen Vor- und Nachnamen separat, manche wollen beides in einem Feld, einige wollen PLZ und Ort separat, andere beides in einem Feld u.s.w.

Ich kann in der Ini also nur bestimmen was generell abgefrgt wird und die eigentlichen Informationen dann aus einem Formular ziehen.

Ich bin jetzt gerade dabei das Ganze auf Deine Methode umzustellen, die Du etwas weiter oben genannt hast. Finde ich gut. Das bißchen Arbeit tut ja nicht weh.

Allerdings habe ich da meine liebe Not.

Eine erste funktion sieht folgendermaßen aus:

Delphi-Quellcode:
function VorundZuname (EditVorname, EditNachname: TEdit) : string;
begin
  Result := EditVorname.Text + ' ' + EditNachname.Text;
end;
Das Problem entsteht beim Einfügen von VorundZuname.

Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
  var
  ini: TInifile;
  filename: String;

begin
filename := ExtractFilePath(ParamStr(0)) + 'einstellungen.ini';
ini := TIniFile.Create(filename);

 
   case Ini.ReadInteger (ComboBoxPresseverteiler.Text, 'F1W', 0) of
  1: if FillForm(WebBrowser1, Ini.ReadString(ComboBoxPresseverteiler.Text, 'F1N', ''), VorundZuname) = False then ShowMessage('Fehler. Formular oder Formularfeld nicht gefunden');
    end ;

  Ini.Free;
  end;
Der Compiler sagt: Not enough actual parameters und setzt den Cursor hinter die Klammer nach VorundZuname.

Volker Z. 1. Mär 2014 03:03

AW: Ini-Wert nicht als string einfügen
 
Hallo,

Zitat:

Der Compiler sagt: Not enough actual parameters und setzt den Cursor hinter die Klammer nach VorundZuname
Na, das ist schon klar! Wenn Du die Funktion
Delphi-Quellcode:
VorundZuname (EditVorname, EditNachname: TEdit) : string;
deklarierst, dann sollten schon auch zwei Parameter übergeben werden, also ein:
Delphi-Quellcode:
if FillForm(WebBrowser1, Ini.ReadString(ComboBoxPresseverteiler.Text, 'F1N', ''), VorundZuname ('Michel', 'Lönneberga')) then
soltte es tun

Gruß

Erutan 1. Mär 2014 03:18

AW: Ini-Wert nicht als string einfügen
 
Hmmm...mir fällt gerade auf, daß ich gar keine Funktionen brauche wenn ich die Werte in der Ini nur als Weiche verwende. Ich kann dann ja genauso gut auch die Editfelder selber eintragen.

Das habe ich jetzt mal versucht und es klappt.
Wenn F1W=1 nimm die Werte aus EditVorname plus EditNachname, wenn F1W=2 nimm nur den Wert aus EditVorname, wenn F1W=3 nimm nur den Wert aus EditNachname u.s.w.

Insofer wäre mein Problem gelöst. Ist nur viel Arbeit.

Vielen Dank und schöne Grüße
Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz