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/)
-   -   Delphi Zeiger TList (https://www.delphipraxis.net/55233-zeiger-tlist.html)

inriz 18. Okt 2005 12:57


Zeiger TList
 
Delphi-Quellcode:
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;
hi!

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

alzaimar 18. Okt 2005 13:04

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.

inriz 18. Okt 2005 13:09

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

maximov 18. Okt 2005 13:34

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 :)

alzaimar 18. Okt 2005 13:36

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:
Var
  slToken : TStringlist;

Begin
  slToken := TStringlist.Create;
  Try
    ExtractToken (szInput, slToken);
    ProcessToken (slToken);
  Finally
    slToken.Free;
    End
End;
Ich muss slToken nicht als Pointer übergeben. slToken IST ein Pointer. Sieht zwar nicht so aus, ist aber so. Nennt sich 'Compiler magic'.

--Eben kommt maximov und sagt das Gleiche

alzaimar 18. Okt 2005 14:22

Re: Zeiger TList
 
Zitat:

Zitat von maximov
Moin,
//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 :)

Nee, würd ich nicht machen. Ich will schon sehen, was das für Variablen sind.
  • f-Felder
    a-Argumente
    i-Integer
    xy-Variable eines TTyps, xy=sl->TStringList etc.

    ProcedureCall (ohne Präfix)

    T-Typendeklaration
    E-Exceptiondeklaration
Was bei Typendeklarationen anfängt, soll doch nicht bei Variablen aufhören, oder?
Aber das ist OT

maximov 18. Okt 2005 16:12

Re: Zeiger TList
 
Da das thema ja geklärt ist, können wir ruhig OT werden ;)

Zitat:

Zitat von alzaimar
Zitat:

Zitat von maximov
Moin,
//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 :)

Nee, würd ich nicht machen. Ich will schon sehen, was das für Variablen sind.
...
Was bei Typendeklarationen anfängt, soll doch nicht bei Variablen aufhören, oder?

Es sollte generell so sein, dass man entweder genau weiss was für ein type die variable hat, denn das kann man meist aus dem kontext oder anhand schön kurzgehaltener methoden erkenne, oder das man es nicht wissen braucht da sich bei der arbeit mit der variable der typ offensichtlich wird.

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!

alzaimar 19. Okt 2005 20:03

Re: Zeiger TList
 
Zitat:

Zitat von maximov
und das ist viel intuitiver und selbsterklärender als hässliche präfixe !BASTA!

... is ja gut, beruhig dich mal wieder. :cat: Meine Meinung: Jedem das Seine. Ich finds hübscher mit Präfixen.

maximov 21. Okt 2005 11:09

Re: Zeiger TList
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von maximov
und das ist viel intuitiver und selbsterklärender als hässliche präfixe !BASTA!

... is ja gut, beruhig dich mal wieder. :cat: Meine Meinung: Jedem das Seine. Ich finds hübscher mit Präfixen.

NEIN - das kann nicht sein *koch* ;)

alzaimar 21. Okt 2005 11:24

Re: Zeiger TList
 
Zitat:

Zitat von maximov
Zitat:

Zitat von alzaimar
Zitat:

Zitat von maximov
und das ist viel intuitiver und selbsterklärender als hässliche präfixe !BASTA!

... is ja gut, beruhig dich mal wieder. :cat: Meine Meinung: Jedem das Seine. Ich finds hübscher mit Präfixen.

NEIN - das kann nicht sein *koch* ;)

Ok, Lan: Lass uns vor Tür gehen und klären das wie Männer in Anatol, alem. Holish mein Brüda, alta.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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