Toon posts:

[Delphi] een string gedeeltelijk uitlezen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag ik heb het volgende probleem, ik heb een string met daarin : 23-44-552-123-11-99

nu wil ik de getallen los uitlezen dus ik wil in mijn variable 'getal' eerst 23 krijgen, daarna 44 enz...

ik heb al van alles geprobeerd maar het lukt met niet, wie weet meer...

  • ThePriest
  • Registratie: Mei 2000
  • Laatst online: 30-01-2024

ThePriest

the one, the only

Zitten die getallen altijd op dezelfde plaats? (of kan het eerste getal ook 2345 zijn zeg maar?
Anders is het een makkie, met de copy-functie. Anders zul je je string moeten doorzoeken tot het streepje. (al kun je dan ook weer min-tekens missen voor negatieve getallen)

  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

Er zit bij Delphi een geweldige helpfunctie met info over stringfuncties...

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • jhksema
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:17
Op zondag 21 april 2002 13:41 schreef BOFH het volgende:
Dag ik heb het volgende probleem, ik heb een string met daarin : 23-44-552-123-11-99

nu wil ik de getallen los uitlezen dus ik wil in mijn variable 'getal' eerst 23 krijgen, daarna 44 enz...

ik heb al van alles geprobeerd maar het lukt met niet, wie weet meer...
Is een string niet een array met characters? Dus kan je afzonderlijke characters weer samenvoegen tot substrings waarmee je probleem is opgelost. Bestaan ook wel standaard functies om je te helpen (copy enzo). Weet het verder niet zo gauw uit m'n hoofd...

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure SplitToStrings(AString: string; const ASeparator: string; AList: TStrings);
var
  iPos: integer;
begin
  AList.BeginUpdate;
  try
    AList.Clear;
    iPos := 1;
    while iPos > 0 do begin
    iPos := Pos(ASeparator, AString);
    if iPos > 0 then begin
      AList.Add(Trim(Copy(AString, 1, iPos-1)));
      AString := copy(AString, iPos + Length(ASeparator), Length(AString));
    end;
    end;
    if AString > '' then AList.Add(Trim(AString));
  finally
    AList.EndUpdate;
  end;
end;

SplitToStrings(<jouw string>, '-', <een bestaande StringList>)

Die StringList bevat daarna al die 'getallen'.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Is een StringList niet een beetje overkill. Misschien is een array meer dan genoeg, al weer ik niet wat je verder wilt doen met je lijstje getallen. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • brid
  • Registratie: Januari 2001
  • Laatst online: 30-07 16:21

brid

Onze excuses voor het ongemak

is toch niet zo moeilijk, speel een beetje met POS en CopySTr en je moet een heel eind komen.
effe wat dummy code
[code]
Copystr(stringetje,0,pos(stringetje,'-')
gooi streepje weg
[\code]

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!


Verwijderd

Tuurlijk is een StringList hier overkill. Maar die SplitToStrings procedure is nogal universeel, en kun je bv. ook gebruiken om de items van een ListBox, etc. te vullen.

Overkill is niet perse nadelig, wanneer 't de mogelijkheden tot hergebruik van code en classes bevordert.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op zondag 21 april 2002 14:49 schreef Afterlife het volgende:

[..]

Overkill is niet perse nadelig, wanneer 't de mogelijkheden tot hergebruik van code en classes bevordert.
Dat is waar, daarom zei ik ook dat ik niet weet wat de topicstarter (of wie dan ook) met het resultaat wil doen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
die getallen zijn altijd 1,2 of 3 tekens en deze wil ik daarna omzetten naar letters zijn zijn namelijk ascii waarden van letters.

bijvoorbeeld:

'bofh' wordt omgezet in : 23-121-134-125-127-
daarna wil ik die string kunnen inlezen en terug zetten naar 'bofh'

Verwijderd

Topicstarter
Ik heb je code geprobeerd maar krijg de melding, Ongeldig adres enzo het programma loopt dan vast.

de bestaande stringlist heb ik genoemd getallen, en daarvan heb ik een Tstring en TstringList gemaakt beide werkte niet, moet het anders zijn ???

dus var getallen : Tstring ??

SplitToStrings(invoer,'-', getallen);
Op zondag 21 april 2002 14:00 schreef Afterlife het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure SplitToStrings(AString: string; const ASeparator: string; AList: TStrings);
var
  iPos: integer;
begin
  AList.BeginUpdate;
  try
    AList.Clear;
    iPos := 1;
    while iPos > 0 do begin
    iPos := Pos(ASeparator, AString);
    if iPos > 0 then begin
      AList.Add(Trim(Copy(AString, 1, iPos-1)));
      AString := copy(AString, iPos + Length(ASeparator), Length(AString));
    end;
    end;
    if AString > '' then AList.Add(Trim(AString));
  finally
    AList.EndUpdate;
  end;
end;

SplitToStrings(<jouw string>, '-', <een bestaande StringList>)

Die StringList bevat daarna al die 'getallen'.

Verwijderd

Hier gaat programmeren toch eigenlijk om?
De functie MidStr() is heel krachtig, en in combinatie met een loop en wat testen kun je dit toch wel oplossen?

Je kunt trouwens ook een char in een String uitlezen dmv van een index
code:
1
2
AString := 'Hey';
AString[2] := 'e';

AString is nu dus 'Hee'

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 09-09 12:09

Delphi32

Heading for the gates of Eden

Op zondag 21 april 2002 15:18 schreef BOFH het volgende:
Ik heb je code geprobeerd maar krijg de melding, Ongeldig adres enzo het programma loopt dan vast.

de bestaande stringlist heb ik genoemd getallen, en daarvan heb ik een Tstring en TstringList gemaakt beide werkte niet, moet het anders zijn ???

dus var getallen : Tstring ??

SplitToStrings(invoer,'-', getallen);
[..]
Ziet eruit als de klassieke instinker. Ik doe het ff voor:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure DoeLeukeDingenMetGetallenInDezeString(invoer: string);
var
  getallen: TStringList;
  i  : integer;
begin
  getallen := TStringList.Create; //10 tegen 1 dat je
                        //deze vergeten was :)
  try
    SplitToStrings(invoer,'-', getallen);
    for i := 0 to getallen.Count - 1 do begin
    //do the fun
    end;
  finally
    getallen.Free; //of FreeAndNil(getallen); :)
  end;
end; //procedure DoeLeukeDingenMetGetallenInDezeString

Een Access Violation betekent 99,99 van de 100x dat je vergeten bent om een object te instantieren (de .Create aan te roepen). In de andere 0,01 gevallen mag je op zoek naar Windows of Delphi bugs.

Verwijderd

Komt ie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function MyConversion(const sInput: String): String;
var
  I: Integer;
  S: String;
begin
  Result:='';
  S:='';
  for I:=1 to Length(sInput) do
    if sInput[I] in ['0'..'9'] then
    S:=S+sInput[I]
    else if S<>'' then
    begin
    Result:=Result+Char(StrToInt(S));
    S:='';
    end;
end;

Verwijderd

Op zondag 21 april 2002 15:21 schreef dR_n00b het volgende:
Hier gaat programmeren toch eigenlijk om?
De functie MidStr() is heel krachtig, en in combinatie met een loop en wat testen kun je dit toch wel oplossen?

Je kunt trouwens ook een char in een String uitlezen dmv van een index
code:
1
2
AString := 'Hey';
AString[2] := 'e';

AString is nu dus 'Hee'
Nee hoor :)
Je string is nog steeds Hey.
Strings in pascal lopen nl. van char 1..n en niet van 0..n-1!

AString[3]:='e'; zal dus AString tot 'Hee' maken.
Pagina: 1