![]() |
Pressemitteilungs-Tool
Hallo,
beruflich habe ich viel mit dem Schreiben von Online-Pressemitteilungen zu tun. Das Problem dabei: Es ist unheimlich zeuitaufwändig, die einzlenen Prosseportale einzeln aufzurufen, die etlichen Felder auszufüllen und abzuschicken. Nun möchte ich mir ein kleines Programm basteln, das mir einen teil dieser Aufgabe abnimmt. Im Jahr 2002 hatte ich schon einmal ein ähnliches Tool mit Delphi6 geschrieben, mit dem man sogenannte Picture Posts bestücken konnte. Da funktionierte auch super. Damals hatte ich fie Feldnamen allerdings alle händisch ausgelesen und in das Programm eingetragen. Das war möglich weil es nur rund 30 interessante Picture Posts gab. Leider liegt die Sache nun aber ein wenig anders und alles ist viel komplizierter. Erstens erwarten die meisten Presseportale einen Login und loggen einen wieder aus wenn man die Seite verläßt. Eine Cookie-Funktion um angemeldet zu bleiben, ist oft nicht vorhanden. Zweitens gibt es oft eine ganze Reihe von Select-Feldern, die jedes mal ein wenig anders aussehen bzw. andere Inhalte aufweisen. Drittens wäre es eine Aufgabe für jemanden, der Vater und Mutter erschlagen hat wenn man all die Feldnamen händisch aus dem Sourcecode auslesen müßte um sie ansprechen zu können. Daß es aber dennoch irgendwie gehen muß zeigen zwei Online-Anbieter von denen einer PR-Gateway ( ![]() Ich würde so ein Tool gerne mit Delphi schreiben, weiß aber nicht, wie. Also ich weiß schon, wie man einen Formularaufüller mit Delphi schreibt aber nicht wie es unter Berücksichtigung der o.g. Probleme funktionieren soll. Kann mir jemand helfen? Viele Grüße Erutan |
AW: Pressemitteilungs-Tool
Ich denke nicht, dass PR-Gateway die Inhalte an die Portale verteilt, indem die einzelnen Seiten aufgerufen werden und die jeweilige Web-Formulare ausfüllt.
Dafür gibt es APIs mit denen solche Daten übermittelt werden. Diesen Weg kannst du auch gehen, musst dir aber für jedes einzelne Portal einen API Zugang holen (evtl. kostenpflichtig). Diese APIs müssen nicht gleich sein, sondern können bei jedem Portal anders realisiert sein. Alternativ kannst du wie angedacht die Web-Formulare automatisch ausfüllen lassen. Der Aufwand sollte überschaubar sein (wenn man es richtig angeht) ;) Eine Seite kann man auf Formulare und deren Felder untersuchen und dann die Feldnamen und den Feldtypen herausfinden. Du wählst jetzt aus, in welche Felder, welcher Inhalt rein soll und merkst dir diese Informationen. Beim nächsten Besuch, kann das Programm das dann automatisch ;) |
AW: Pressemitteilungs-Tool
Hi Sir Rufo,
vielen herzlichen Dank für die superschnelle Antwort. Bei mir hat es etwas länger gedauert weil ich einfach davon ausgegangen war, daß Delphi 6 auch unter win7 problemlos laufen würde. Ging aber erst mal nicht. Dann habe mein altes Programm wieder ausgekramt, das ich vor Jahren geschrieben hatte weil ich mittlerweile vergessen hatte wie ich das damals gemacht habe. Nun das zweite Problem: Kann man unter Win7 etwa nichts mehr in ini-Dateien speichern? Au weia. Ich hatte so ziemlich alle Programmeinstellungen in ini-Dateien gespeichert weil ich mich an die Registry nie rangetraut habe. Und nu? Jetzt weiß ich erst mal nicht mehr weiter. Muß mich da erst wieder reinfinden. Wäre echt für jede Hilfe dankbar. Was die API angeht: Ich wüßte ja nicht mal wie ich so eine API-Schnittstelle bei Drupal freigeben könnte wenn ich Drupoal auf meinem Server installiert habe, geschweige denn wie man sie anspricht. Ich hatte mir damals Delphi nach ganz praktischen Überlegungen so weit beigebracht wie ich es gerade eben brauchte und mehr als die Hälfte davon wieder vergessen. Ich habe allerdings mittlerweile herausgefunden, daß ich alle Informationen, die ich damals in die Formularfelder eintragen lassen habe, vorher in einer ini gespeichert habe. Das war die Userdat.ini. Darin wurden beim Beenden des Programms auch alle Programmeinstellungen hinterlegt. Wenn ich das jetzt aber machen will bleibt die ini einfach leer. Eine normale Textdatei läßt sich aber noch beschreiben. Oh je, da habe ich mir was vorgenommen. Aber ich will das unbedingt machen weil so ein Anmeldetool - wenn es erst mal fertig ist - stundenlange langweilige Tipparbeit einspart. |
AW: Pressemitteilungs-Tool
Zitat:
Zitat:
Also am besten dort speichern wo es schon seit jahren vorgesehen war wie unter C:\ProgramData oder in deinem Profil unter %Appdata%. |
AW: Pressemitteilungs-Tool
Zitat:
Zitat:
Bei den ersten Startversuchen des alten Programms hagelte es natürlich Fehlermeldungen weil die absolut eingetragenen Pfade zu den Dateien nicht auf meiner jetzigen festplatte vorhanden sind. Ich habe daher im Sourcecode einfach alle Pfade herausgelöscht und die Dateien ins gleiche Verzeichnis gelegt wie die ausführbare Datei. Das Verzeichnis liegt auf einer reinen Datenpartition, also nicht unter C: Irgendwo werden dennoch Daten gespeichert denn wenn ich die Editfelder ausfülle, das Programm beende und dann wieder starte, werden einige Felder wieder mit den alten Daten gefüllt. Ich habe bloß keinen Schimmer, wo die gespeichert werden. Bin alle Dateien durchgegangen und finde sie alle leer vor. Ich werde aber jetzt alles noch mal durchforsten. Daß sich inis doch noch speichern lassen, beruhigt ein bißchen. Allerdings werde ich (weil längere Texte dabei) in einigen Fällen trotzdem darauf zurückgreifen müssen, die Inhalte zweilenweise in eine Datei zu speichern und so wieder auszulesen. Eine andere Möglichkeit kenne ich leider nicht. Grüße Holger P.S.: Falls es übrigens jemanden interessiert kann ich die ganze Sache gerne mal hier zum Download einstellen. |
AW: Pressemitteilungs-Tool
Im Explorer als Adresse eintragen und von da weitersuchen ;)
Code:
%AppData%\Local\VirtualStore
|
AW: Pressemitteilungs-Tool
Danke.
Ja, da wurde tatsächlich eine zentrale ini-Datei angelegt. Ich hatte vergessen, daß man den Speicherplatrz immer mit absoluten Pfaden angeben muß wenn man bestimmen will wo die ini gespeichert wird. Hab' ich jetzt nachgeholt und es klappt :-D Jetzt habe ich aber wieder ein neues Problem. Jaja, mühsam ernährt sich das Eichhörnchen. So langsam komme ich wieder hinter die Geheimnisse des alten programms. Manches aber ist neu und da komme ich nicht weiter. Z.B. habe ich einige Daten in eine textdatei abgespeichert,die per SaveDialog aufgerufen wurde. Das klappt jetzt auch immer noch...allerdings nur, wenn es sich um einzeilige Texte handelt. Seit heute versuche ich jedoch, ein Adressfeld abzuspeichern und das besteht ja nun mal aus mindestens drei Zeilen. Das klappt nun nwieder nicht. Beim Einlesen der zuvor gespeicherten Datei wird nur die erste der drei Zeilen eingelesen. Das ist auch eigentlich klar, denn ich schreibe mit writeLn und lese mit readLn Also WriteLn(Datei,MemoAdresse.Text); und zurücklesen mit ReadLn(Datei,String1); MemoAdresse.Text:=String1; wobei String1 eine zuvor deklarierte Variable ist deren Funktion mir nicht mehr ganz klar ist. So, ich versuch's jetzt weiter. Viele Grüße Holger |
AW: Pressemitteilungs-Tool
Hallo,
mach doch aus WriteLn(Datei,MemoAdresse.Text); MemoAdresse.SaveToFile (Filename); und ReadLn(Datei,String1); MemoAdress.LoadFromFile (Filename); Gruß |
AW: Pressemitteilungs-Tool
Hi Volker,
das geht in dem Fall leider nicht...denke ich jedenfalls. Denn aus der einen Textdatei werden mehrere EditFelder und Memofelder "bestückt". Was ich pepostet hatte war nur ein Ausschnitt. Das Ganze sieht so aus:
Delphi-Quellcode:
Ich habe mir jetzt vorübergehend damit beholfen, für jedes Momofeld einen eigenen Speicherknopf anzulegen. Aber das ist nicht gerade elegant und nimmt viel Platz weg.
procedure TForm1.Speichern1Click(Sender: TObject);
var Datei: TextFile; begin if SaveDialog1.Execute then AssignFile(Datei, SaveDialog1.FileName); Rewrite(Datei); WriteLn(Datei, EditName.Text); WriteLn(Datei,EditEmail.Text); WriteLn(Datei,EditPassword.Text); WriteLn(Datei,EditTelefon.Text); WriteLn(Datei,EditUeberschrift.Text); WriteLn(Datei,EditBeschreibung.Text); WriteLn(Datei,EditAnmerkungen.Text); WriteLn(Datei,MemoAdresse.Text); CloseFile(Datei); end; |
AW: Pressemitteilungs-Tool
Wenn Delphi-Code gepostet wird, wäre es schön, wenn der in Delphi-Tags gesetzt wird, dann bekommt man auch kein Augenkrebs ;)
so schreiben
Code:
und so aussehen
[DELPHI]
procedure foo; begin // ein Kommentar end; [/DELPHI]
Delphi-Quellcode:
Um einen String zuverlässig in eine Zeile zu schreiben, sollte man spezielle Zeichen, wie die Zeilenumbrüche, einfach escapen
procedure foo;
begin // ein Kommentar end;
Delphi-Quellcode:
Jeden String, den du in die Datei schreibst schickst du jetzt einmal durch den Escaper
uses
SysUtils; const C_ESCAPE_CHAR = '\'; C_SUBST_CHARS : array[0..7] of char = ( #0, #7, #8, #9, #10, #11, #12, #13 ); C_ESCAPE_CHARS : array[0..7] of char = ( '0', 'a', 'b', 't', 'n', 'v', 'f', 'r' ); function EscapeStr( const AStr : string ) : string; var LIdx : Integer; begin Result := AStr; Result := StringReplace( Result, C_ESCAPE_CHAR, C_ESCAPE_CHAR + C_ESCAPE_CHAR, [rfReplaceAll] ); for LIdx := 0 to 7 do Result := StringReplace( Result, C_SUBST_CHARS[LIdx], C_ESCAPE_CHAR + C_ESCAPE_CHARS[LIdx], [rfReplaceAll] ); end; function UnescapeStr( const AStr : string ) : string; var LIdx : Integer; begin Result := AStr; for LIdx := 0 to 7 do Result := StringReplace( Result, C_ESCAPE_CHAR + C_ESCAPE_CHARS[LIdx], C_SUBST_CHARS[LIdx], [rfReplaceAll] ); Result := StringReplace( Result, C_ESCAPE_CHAR + C_ESCAPE_CHAR, C_ESCAPE_CHAR, [rfReplaceAll] ); end;
Delphi-Quellcode:
Beim Zurücklesen natürlich einmal wieder durch den Unescaper ;)
procedure TForm1.Speichern1Click( Sender: TObject );
var Datei: TextFile; begin if SaveDialog1.Execute then begin AssignFile( Datei, SaveDialog1.FileName ); Rewrite( Datei ); WriteLn( Datei, EscapeStr( EditName.Text ) ); WriteLn( Datei, EscapeStr( EditEmail.Text ) ); WriteLn( Datei, EscapeStr( EditPassword.Text ) ); WriteLn( Datei, EscapeStr( EditTelefon.Text ) ); WriteLn( Datei, EscapeStr( EditUeberschrift.Text ) ); WriteLn( Datei, EscapeStr( EditBeschreibung.Text ) ); WriteLn( Datei, EscapeStr( EditAnmerkungen.Text ) ); WriteLn( Datei, EscapeStr( MemoAdresse.Text ) ); CloseFile( Datei ); end; end; |
AW: Pressemitteilungs-Tool
Hallo,
Zitat:
@Erutan: Sorry, konnte ich nicht wissen, dass das Memo Teil einer mehrschichtigen Geschichte ist. Anstatt mit Writeln zu arbeiten, würde ich mal einen Filestream in die Runde werfen:
Delphi-Quellcode:
Gruß
interface
TForm1 = class(TForm) // Deklarationen muss man sich halt denken, nur das Wesentliche private { Private-Deklarationen } procedure LoadFromFile (const Filename : string); procedure SaveToFile (const Filename : string); public { Public-Deklarationen } end; implementation procedure TForm1.LoadFromFile (const Filename : string); var s : TFileStream; function Load (Stream : TFileStream) : string; var l : Integer; b : array of Char; begin Result := ''; Stream.ReadBuffer (l, SizeOf (Integer)); Inc (l); SetLength (b, l); try Stream.ReadBuffer (b [0], l - 1); Result := string (b); finally Finalize (s) end end; begin s := TFileStream.Create ('c:\test.txt', fmOpenRead); try s.Seek (0, soFromBeginning); EditName.Text := Load (s); EditMail.Text := Load (s); EditPasswort.Text := Load (s); // etc. finally FreeAndNil (s) end end; procedure TForm1.SaveToFile (const Filename : string); var s : TFileStream; procedure Save (Stream : TFileStream; const Str : string); var l : Integer; begin l := Length (Str); Stream.WriteBuffer (l, SizeOf (Integer)); Stream.WriteBuffer (Str [1], l) end; begin s := TFileStream.Create (Filename, fmCreate); try try Save (s, EditName.Text); Save (s, EditMail.Text); Save (s, EditPasswort.Text); // etc. except // Was auch immer zu tun ist wenn das Einlesen scheitert end; finally FreeAndNil (s) end end; procedure TForm1.Button3Click(Sender: TObject); begin LoadFromFile ('ein dateiname.erweiterung'); end; procedure TForm1.Button4Click(Sender: TObject); begin SaveToFile ('ein dateiname.erweiterung') end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz