![]() |
Zeiger TList
Delphi-Quellcode:
hi!
function TForm1.GetTokenList(sCommand, sSeparator : string; tlToken : TListPtr) : Integer;
var sTmp : string; sCurrentToken : string; iPos : Integer; iResult : Integer; // anzahl der token iRest : Integer; pTmp : Pointer; begin iResult := 0; sTmp := sCommand; iPos := Pos(sSeparator, sTmp); if iPos > 0 then begin repeat iRest := Length(sTmp) - iPos; sCurrentToken := LeftStr(sTmp, iPos - 1); // hier können laufzeitfehler entstehen ... pTmp := Pointer(sCurrentToken); sTmp := RightStr(sTmp, iRest); iPos := Pos(sSeparator, sTmp); tlToken.Add(pTmp); Inc(iResult); until not (iPos > 0); if Length(sTmp) > 0 then begin pTmp := Pointer(RightStr(sTmp, Length(sTmp))); tlToken.Add(pTmp); Inc(iResult); end; end; Result := iResult; end; { @@@@ Borland kram} procedure TForm1.BtnGetTokenClick(Sender: TObject); var sStr : string; sIndex : Integer; lToken : TList; iLoop : Integer; sToken : string; pTmp : Pointer; begin sStr := EdtText.Text; lToken := TList.Create; if Length(sStr) > 0 then begin sIndex := GetTokenList(sStr, ':', @lToken); if sIndex > 0 then begin for iLoop := 0 to lToken.Count - 1 do begin pTmp := lToken.Items[iLoop]; sToken := PChar(pTmp); MemResult.Lines.Add(sToken); end; end; end; end; der string der gettokenlist übergeben wird beinhaltet folgenden wert : 12345:foo:bar die funktion soll nun diesen wert durch den separator : splitter und alle token in eine liste schreiben diese liste wird als zeiger übergeben ... das programm lässt sich ausführen, jedoch bekomme ich nicht die werte im memo angezeigt die ich wollte ;-) sondern nur: online online onl könnt ihr mir helfen? welche grundlegenden dinge habe ich bei den zeigeroperationen gemacht? gruß inriz |
Re: Zeiger TList
Grundlegend:
1. Du erzeugst mit RightStr einen Substring und meinst, das dieser Speicherbereich nach Verlassen der Prozedure noch gültig ist. 2. Du übergibst die tlList als Pointer, obwohl das unnötig ist. 3. Du hast überlesen, das die Klasse TStringList sowas schon kann. |
Re: Zeiger TList
hi,
zu 3: tstringlist hab ich mir gerade angeschaut und das werde ich jetzt auch verwenden! zu 2: soll ich also in gettokenlist eine tstringlist erstellen und diese dann zurückgeben? vorab ich komm aus der c welt und bin ein solche vorgehensweise gewohnt ;-) wie stell ich das am besten an? gruß inriz |
Re: Zeiger TList
Moin,
ich würd dir raten die StringListe nicht von der procedure erstellen zu lassen, da somit die besitzverhältnisse nicht klar sind. Das würd ich nur tun, wenn du diese procedure ausdrücklich als fabrik-function kennzeichnest, was sich dann im namen widerspiegeln sollte, wie zb. CreateTokenList. ich würds also so tun:
Delphi-Quellcode:
procedure TForm1.GetTokenList(Command, Separator : string; Tokens : TStrings);
var sTmp : string; sCurrentToken : string; iPos : Integer; iResult : Integer; // anzahl der token iRest : Integer; pTmp : Pointer; begin // erstmal prüfen ob die liste gültig ist if not Assigned(Tokens) then raise Exception.Create('Tokens must be assigned!'); // und dann damit arbeiten ... end; { @@@@ Borland kram} procedure TForm1.BtnGetTokenClick(Sender: TObject); var tokens:TStringList; begin tokens:=TStringList.Create; try // da sparst du dir auch noch jede menge blöd kram ;) GetTokenList(Edit1.Text, tokens); MemResult.Lines.AddString(Tokens); finally tokens.free; end; end; //PS: die nervigen präfixe kannst du in delphi ruhig weglassen, da sie durch die strenge typisierung völlig überflüssig sind. Das ist nur so ne historisch angewohnheit von den c-typen :) |
Re: Zeiger TList
Das sieht man, das Du von C kommst :zwinker:
Ich halte es so: Derjenige, der Unordnung macht, räumt hinterher wieder auf! Hier also so:
Delphi-Quellcode:
Ich muss slToken nicht als Pointer übergeben. slToken IST ein Pointer. Sieht zwar nicht so aus, ist aber so. Nennt sich 'Compiler magic'.
Var
slToken : TStringlist; Begin slToken := TStringlist.Create; Try ExtractToken (szInput, slToken); ProcessToken (slToken); Finally slToken.Free; End End; --Eben kommt maximov und sagt das Gleiche |
Re: Zeiger TList
Zitat:
Aber das ist OT |
Re: Zeiger TList
Da das thema ja geklärt ist, können wir ruhig OT werden ;)
Zitat:
Das was bei der typ deklaration anfängt ist heutzutage auch schon wieder geschichte, wenn du da auf das T oder das I ansprichst. In moderneren sprachen wie c# gibt es das T nicht mehr und es ist auch gänzlich überflüssig, da man ja schliesslich weiss wo bei einer deklaration der typ hingehört. Dh. es kann eine variable und einen typ mit dem selben namen geben. und das ist viel intuitiver und selbsterklärender als hässliche präfixe !BASTA! |
Re: Zeiger TList
Zitat:
|
Re: Zeiger TList
Zitat:
|
Re: Zeiger TList
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 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