![]() |
Internet to Listview
Moin, nachdem ich jetzt schon das dritte das Protokoll gewechselt habe, hab ich mir überlegt ich mach es jetzt so:
Ich lade eine Textdatei auf meinen Server hoch die die wichtigen Daten stehen dann in der Form drin: Eintrag 1 : Name | Author | Datum Eintrag 2 : Name | Author | Datum Eintrag 3 : Name | Author | Datum Wie ich auf die Datei zugreife ist mir klar -> idHttp.Get(wwww....ww..); Daten := idHttp.Body; Nun die Frage: Wie lese ich die Strings aus in einzelne Zeilen und vor allem wie mach ich dem Programm klar das es aufhören soll wenn kein Text mehr kommt ohne das es abstürzt? |
Re: Internet to Listview
Trennen kannst
-per StringListe ( Delimiter, DelimitedText) -Pos()/PosEx() -Explode ... |
Re: Internet to Listview
Ich habe das ganze jetzt nochmal auf TCPIP Basis probiert:
Der Client:
Delphi-Quellcode:
procedure TForm6.Button3Click(Sender: TObject);
var Maps : string; LI : TListItem; StrArr : TDynStringArray; begin if Form1.Client.Connected = false then begin Form1.Client.Connect(3000); end; Form1.Client.WriteLn('Maplist'); Maps := Form1.Client.ReadLn; if Length(Maps) > 0 then begin Maplist.Clear; StrArr := Explode('|', Maps); LI := Form6.Maplist.Items.Insert(0); LI.Caption := StrArr[1]; LI.SubItems.Add(StrArr[3]); LI.SubItems.Add(StrArr[2]); end; Form1.Client.Disconnect; end; Der Server:
Delphi-Quellcode:
if StrArr[0] = 'Maplist' then
begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+ 'maplist.ini'); try Anzahl := ini.ReadInteger('Maplist','Anzahl',0); for i := 1 to Anzahl do Maps := ini.ReadString('Maplist', IntToStr(i), ''); AThread.Connection.WriteLn('Maplist|'+Maps); Sleep(100); finally ini.free; end; end; Die Maplist:
Delphi-Quellcode:
Erklärung:
[Maplist]
Anzahl=4 1=area_Fayt_51|D-FENS|29.07.09 2=Die_Sanduhr|D-FENS|29.07.09 3=Krossfire|D-FENS|29.07.09 4=Iron_Mountain|D-FENS|02.08.09 5=CenterWar|veCtor|17.07.09 6=WaterPath|veCtor|21.07.09 7=Maptest|RedShakal|08.08.09 8=newm_01|-|26.07.09 9=newm_02|-|26.07.09 10=newm_03|-|26.07.09 11=newm_04|-|26.07.09 12=mlti_01|-|10.08.09 13=mlti_02|-|10.08.09 14=mlti_03|-|10.08.09 15=mlti_04|-|10.08.09 16=mlti_05|-|10.08.09 17=mlti_06|-|10.08.09 18=mlti_07|-|10.08.09 19=mlti_08|-|10.08.09 20=mlti_09|-|10.08.09 21=mlti_10|-|10.08.09 22=mlti_11|-|10.08.09 23=mlti_12|-|10.08.09 24=mlti_13|-|10.08.09 25=mlti_14|-|10.08.09 26=mlti_15|-|10.08.09 1. Client schickt Anfrage zum Server 2. Server wertet Anfrage aus 3. Server öffnet Map Datenbank ( Ini Datei ) 4. Map liest Wert "Anzahl" aus der angibt, wieviele Maps vorhanden sind 5. Server arbeitet Map 1 bis Map (Wert von Anzahl) aus Bis hierhin funktioniert alles soweit. 6. Server schickt Stringweise die Daten zum Client 7. Der Client schreibt jeden String in die Listview Wo ist das Problem? Beim Client kommt immer nur die letzte Map an. In meinem Fall steht Anzahl auf 4, daher kommt nur Iron_Mountain|D-FENS|02.08.09 in der Listview an. Ich hatte auch schon versucht die Anzahl in dem String mitzuschicken, aber das endete darin, das ich 3 Leerzeilen hatte und erst dann Map 4 auftauchte. Ich vermute es liegt daran das ich Readln öfter als 1x aufrufen muss aber leider bin ich mir nicht sicher wie ich das anstellen soll. Wie gesagt zählschleifen führen zu leerzeilen. |
Re: Internet to Listview
Hallo Patrick,
weil Du den FOR-Befehl ohne Statement-Block (BEGIN END) ausführst, wird dein WriteLn() erst dann ausgeführt, wenn alle ReadLn() ausgeführt wurden. Freundliche Grüße marabu |
Re: Internet to Listview
[OT]Hallo Achim, schön mal wieder etwas von dir zu hören (lesen)[/OT]
|
Re: Internet to Listview
Hallo, ich hab das ganze jetzt mal mit Begin und End ausprobiert. Wenn ich den Button Drücke, wird beim ersten mal "Die Sanduhr" ( Nr. 2) ausgegeben. Ist die erste und einzige Zeile. Wenn ich nochmal draufdrücke, wird "Iron Mountain" ( Nr. 4) ausgegeben.
Warum ist das so? |
Re: Internet to Listview
Lass mal das Sleep() weg
|
Re: Internet to Listview
Zitat:
Bevor ich jetzt Gehirnschmalz aufbringe, um den Code da oben im Kopf nachzuvollziehen wäre es wesentlich effizienter, wenn du deinen Code debuggen würdest. Der Debugger ist nämlich eines der besten, wenn nicht gar das Beste Werkzeug, um heruaszufinden, warum Codezeile Nr. 42 ausgeführt wird, aber Codezeile Nr. 23 nicht. Falls du dich damit nicht auskennst, sei dir dieses Tutorial empfohlen: ![]() |
Re: Internet to Listview
So ich hab jetzt ein bissel gebastelt und es funktioniert soweit. Leider macht aber die Listview jetzt Probleme
Delphi-Quellcode:
Eigentlich sollte er ja mit diesem Code jedesmal eine neue Zeile machen, aber leider schreibt er immer in die gleiche Zeile. Habe ich da irgentwas vergessen? I wird beim erstellen auf 1 gesetzt und bei jedem durchgang um 1 erhöht.
LI := Form6.Maplist.Items.Insert(i);
LI.Caption := StrArr[1]; LI.SubItems.Add(StrArr[3]); LI.SubItems.Add(StrArr[2]); i := i+1; |
Re: Internet to Listview
Versuch es mal mit
Delphi-Quellcode:
LI := Form6.Maplist.Items.Add;
|
Re: Internet to Listview
das hatte ich davor schon bereits probiert, hat aber leider keinen effekt
|
Re: Internet to Listview
Was meinst du mit kein effekt?
|
Re: Internet to Listview
naja er überschreibt immernoch die erste Zeile
|
Re: Internet to Listview
Dürfte er eigentlich nicht. Zeige mal etwas mehr Code
|
Re: Internet to Listview
Delphi-Quellcode:
function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
var SepLen: Integer; F, P: PChar; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then P := StrEnd(F); SetLength(Result, Length(Result) + 1); SetString(Result[High(Result)], F, P - F); F := P; if P = Separator then SetLength(Result, Length(Result) + 1); while (P^ <> #0) and (P - F < SepLen) do Inc(P); end; end; procedure TForm6.Button3Click(Sender: TObject); var Maps : string; LI : TListItem; StrArr : TDynStringArray; begin if Form1.Client.Connected = false then begin Form1.Client.Connect(3000); end; Form1.Client.WriteLn('Maplist'); repeat Maps := Form1.Client.ReadLn; if Length(Maps) > 0 then begin Maplist.Clear; StrArr := Explode('|', Maps); LI := Maplist.Items.Add; LI.Caption := StrArr[2]; LI.SubItems.Add(StrArr[4]); LI.SubItems.Add(StrArr[3]); i := i+1; end; until i = StrToInt(StrArr[1]); Form1.Client.Disconnect; end; procedure TForm6.FormCreate(Sender: TObject); begin i := 1; end; end. |
Re: Internet to Listview
Du löschst den ListView auch
Delphi-Quellcode:
for i := 1 to StrArr[1] do
begin Maps := Form1.Client.ReadLn; if Length(Maps) > 0 then begin StrArr := Explode('|', Maps); LI := Maplist.Items.Add; LI.Caption := StrArr[2]; LI.SubItems.Add(StrArr[4]); LI.SubItems.Add(StrArr[3]); end; end; |
Re: Internet to Listview
ach ich bin doch doof :oops: das clear ist durch nen Logikfehler an der falschen Stelle gelandet :wall:
dankeschön :mrgreen: Edit: Was mir aufgefallen ist: Wenn ich das erste mal auf Update klicke, fehlt die letzte Map. Wenn ich nochmal klicke ist sie wieder da. Woran könnte das liegen? das Problem tritt auch auf, wenn ich einen Delay setze beim senden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 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