Bei einem neuen Projekt vermisste ich die Umlaute. Dieses Problem lässt sich so lösen:
memo_ziel.text:=Utf8ToAnsi(memo_quelle.Text);
Bei einem neuen Projekt vermisste ich die Umlaute. Dieses Problem lässt sich so lösen:
memo_ziel.text:=Utf8ToAnsi(memo_quelle.Text);
Für die Automatisierung mit Hilfe des TWebbrowser benötigt man den folgenden Code.
uses mshtml;
…
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
i, j: Integer;
FormItem: Variant;
begin
Result := False;
//no form on document
if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
begin
Exit;
end;
//count forms on document
for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
begin
FormItem := WebBrowser.OleObject.Document.forms.Item(I);
for j := 0 to FormItem.Length - 1 do
begin
try
//when the fieldname is found, try to fill out
if FormItem.Item(j).Name = FieldName then
begin
FormItem.Item(j).Value := Value;
Result := True;
end;
except
Exit;
end;
end;
end;
end;
…
if FillForm(WebBrowser1, 'username', 'mein_username') = False then
Form1.caption:=version;
=> Ausfüllen des Formularfeldes „username“ mit dem Inhalt „Username“.
=> Ausweitbar auf weitere Formularfelder wie „passwort“, „webseite“ usw., sofern Objektnamen bekannt.
Webbrowser1.OleObject.document.forms.item(0).submit();
=> Ausgefüllte Inhalte werden abgeschickt
Bei einem unserer Projekte musste ich eine Lösung suchen, welche das Anklicken von Webseitenelementen erlaubt.
Vorausgesetzt, es handelt sich hierbei um einen „span“-tag, welcher einen eindeutigen (!) Namen trägt, gehe ich so vor:
var
ovElements: OleVariant;
i: Integer;
…
try
ovElements := WebBrowser1.OleObject.Document.all;
for i := 0 to (ovElements.Length - 1) do
if (ovElements.item(i).className = 'name') then
begin
try
ovElements.item(i).Click;
except
//fehlerbehandlung I
end;
end;
except
//fehlerbehandlung II => TEST
end;
Im Normalfall muss man sich (leider) bei Delphi mit einer veralteten IExplorer-Version herum ärgern, wenn man Seiten wie bspw. Instagram aufrufen und „bearbeiten“ möchte.
Dieses Problem kann man nun so lösen:
uses registry
…
type
TIEMode = (iemIE7, iemIE8, iemIE10);
=> Vardeklaration
procedure SetWebbrowserMode(Mode: TIEMode; AppName: string = '');
const
REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
var
Reg: TRegistry;
Value: Integer;
begin
if AppName = '' then
AppName := ExtractFileName(Application.ExeName);
Case Mode of
iemIE7 : Value := $1B58;
iemIE8 : Value := $1F40;
iemIE10 : value := $2710;
end;
Reg := TRegistry.Create();
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(REG_KEY, True) then
begin
Reg.WriteInteger(AppName, Value);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
=> Funktion für Browserversionswechsel
SetWebbrowserMode(iemIE10);
=> Browserversion auf IE10 setzen (Funktionsaufruf)
Um die Datengrößen überschaubar zu halten, fügt man den folgenden Code vor „uses“ in die Projektdatei ein:
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
Folgender Code löst das Sortierproblem bei folgender Ausgangslage:
– Stringgrid, gefüllt mit Zahlen
procedure SortGrid(Grid: TStringGrid; Col: integer);
var i, j: integer;
prev: string;
begin
for j:= 0 to Grid.RowCount- 1 do
for i:= 2 to Grid.RowCount- 1 do
begin
if strtoint(Grid.Cells[Col, i])> strtoint(Grid.Cells[Col, i-1]) then
begin
prev:= Grid.Rows[i- 1].CommaText;
Grid.Rows[i- 1].CommaText:= Grid.Rows[i].CommaText;
Grid.Rows[i].CommaText:= prev;
end;
end;
end;
Der Aufruf funktioniert über den folgenden Befehl:
SortGrid(grid, [spalte]);
„[spalte]“ muss dann entsprechend gefüllt werden (2,1 etc.).
Auf der Suche nach einer Möglichkeit, Links aus bspw. CSV, XML etc. auslesen zu können, entdeckte ich die folgende Möglichkeit:
Unit zum Auslesen von Links aus Text-Datei (Delphipraxis, Account zum Download der Unit notwendig)
Die Einbindung funktioniert wie folgt:
//ausleseprozedur
procedure auslesen;
var
Links: TExtractLinksFromTextFile;
Link: TLinkObj;
i: Integer;
begin
Memo1.Clear;
Links := TExtractLinksFromTextFile.Create;
try
Links.Filename := filename;
Links.ExtractLinks;
for i := 0 to Links.LinkList.Count – 1 do
begin
Link := TLinkObj(Links.LinkList.Items[i]);
Memo1.Lines.Add(Link.Caption+‘: ‚+ Link.HREF);
end;
finally
Links.Free;
end;
end;
//einleseprozedur
procedure einlesen;
begin
quelle.text:=idhttp1.get(quell_datei);
auslesen;
memo1.lines.savetofile(ziel_datei);
// gef.-Liste weiter verarbeiten
end;