Avatar billede challenger Nybegynder
29. oktober 2004 - 00:25 Der er 14 kommentarer og
2 løsninger

Redigere udvalgte TStrings inden de addes til en TStringList

Er der en der har lyst til at lave en procedure for mig?
Eller komme med forslag til en løsning...
Her er et lille uddrag fra min fil:

[Output 1]
Type=TImageOutput
FilePath=Icons\ingrave_wide.png
MasterAlpha=255

[Output 3]
Type=TImageOutput
FilePath=D:\Icons\ingrave_ultrawide.png
MasterAlpha=255

Jeg har vha en search function allerede fået sorteret det sådan, at jeg kun står tilbage med de linjer der indeholder 'FilePath='.
Dette er puttet i en TStringlist og ser sådan ud:

FilePath=Icons\ingrave_wide.png
FilePath=D:\Icons\ingrave_ultrawide.png

Det jeg har brug for, er muligheden for at ændre UDVALGTE strenge markant, inden de tilføjes en TStringList.

Tilføje tekst:

<'noget tekst'>FilePath=<'noget tekst'>D:\Icons\ingrave_ultrawide.png<'noget tekst'>

Fjerne tekst:

<'FilePath=' skal slettes> :
D:\Icons\ingrave_ultrawide.png

Håber en kan hjælpe...
Avatar billede stoney Nybegynder
29. oktober 2004 - 09:45 #1
Altså du vil have vist din stringlist, og så vælge
hvilke du vil ændre ? eller vil du ændre alle med samme tekst før =
eks. Filepath  ?

Stoney
Avatar billede hreiff Nybegynder
29. oktober 2004 - 10:12 #2
Kig på Insert og Delete (tilføj og slet til/fra strenge)
Avatar billede challenger Nybegynder
29. oktober 2004 - 10:16 #3
Det nemmeste er nok at ændre de TStringList.items som ligger i TStringlisten.

Som det ses er Strengene ikke ens i TStringListen.
FilePath=Icons\ingrave_wide.png
FilePath=D:\Icons\ingrave_ultrawide.png
Det er derfor vigtigt, at jeg kan vælge hvilke linjer der skal ændres i.

Nogle linjer skal tilføjes tekst, andre skal have slettet tekst og nogle skal have erstattet noget eksisterende tekst med andet. Det skal med andre ord være muligt, at angive HVOR i TStringen man ønsker at ændre indholdet.. Det lød måske lidt forvirrende. Svært at forklare i tekst...

Håber det er til at forstå... (lidt nemmere når man sidder med en ved skærmen) :)
Avatar billede challenger Nybegynder
29. oktober 2004 - 10:21 #4
Så vidt jeg ved, er der forskel på hvordan TStrings og Strings håndteres.
Fx har Delete ikke samme funktion på TStrings som på Strings.
Avatar billede hreiff Nybegynder
29. oktober 2004 - 10:23 #5
Er det noget du vil gøre manuelt ?

Hvis ja, er det nemmeste nok: Når du markerer en linje i en listbox (TStringList) kopieres linjen til en editbox. Her kan du editere som du har lyst. Når der trykkes retur, kopieres indholdet tilbage til listbox'en.

Er det sådan noget du tænker på ?
Avatar billede challenger Nybegynder
29. oktober 2004 - 12:28 #6
Jeg er ikke sikker på jeg forstår hvad du mener, men det hele skal jo foregå i koden.
Det lyder for mig som om du vil have, at jeg skal trykke på linjerne i listboxen i det kørende program...?
Jeg kan godt følge dig i, at du vil kopiere Strings til en editbox, da det åbner op for flere muligheder for redigering (delete, insert m.m.)
Har du evt. et kodeeksempel?
Avatar billede hreiff Nybegynder
29. oktober 2004 - 12:49 #7
procedure TForm1.FormCreate(Sender: TObject);
begin
Listbox1.clear;
listbox1.items.add('c:\1234\sfgg\avc.exe');
listbox1.items.add('d:\abc\adsfsfgg\abc.exe');
listbox1.items.add('e:\qwerty\sffsfgg\aec.exe');
Edit1.text := '';
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.text := Listbox1.items[Listbox1.ItemIndex];
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then
  begin
    Listbox1.items[Listbox1.ItemIndex] := Edit1.text;
    edit1.text := '';
    Listbox1.setfocus;
  end;
end;
Avatar billede challenger Nybegynder
29. oktober 2004 - 13:40 #8
Det ser ud til at du lægger op til, at det ikke sker i koden, men i det kørende program. (keypress er jo lig med brugerinteraktion i et kørende program).
Så dit eksempel kan jeg desværre ikke acceptere - som svar.
Men ellers tak!

For at finde ud af HVOR i linjen der skal editeres, skal TStringen (linjen) gennemsøges for et bestemt ord, fx '\eksmpl.exe'...
Men jeg mener egentlig, det er rimelig præcist forklaret i det indledende spørgsmål i denne tråd. :)
Derefter <tilføj tekst> OG/ELLER <slet tekst> OG/ELLER <ændre tekst>
Avatar billede challenger Nybegynder
29. oktober 2004 - 13:42 #9
Rettelse: (kom til at bytte om på de to sidste linjer i sidste indlæg)

(...)
For at finde ud af HVOR i linjen der skal editeres, skal TStringen (linjen) gennemsøges for et bestemt ord, fx '\eksmpl.exe'...
Derefter <tilføj tekst> OG/ELLER <slet tekst> OG/ELLER <ændre tekst>

Men jeg mener egentlig, det er rimelig præcist forklaret i det indledende spørgsmål i denne tråd. :)
Avatar billede hreiff Nybegynder
29. oktober 2004 - 13:50 #10
Det var jo derfor jeg spurgte om det skulle være manuelt.

I stedet må du bruge pos, insert og delete.

f.eks:

st: string;
i: byte;

i := pos('\eksmpl.exe',st);
if i <> 0 then
delete(st,i+8,3);
insert('png',st,i);

{erstatter 'exe' med 'png' i en string der indeholder '\eksmpl.exe')

Du kan således gennemsøge alle strings i en TStrings.
Avatar billede hreiff Nybegynder
29. oktober 2004 - 13:52 #11
Eller i strengen inden du tilføjer den til din TStringList
Avatar billede hreiff Nybegynder
29. oktober 2004 - 14:08 #12
Her er noget automatisk:
(indeholder en ListBox og en Button)

procedure TForm1.FormCreate(Sender: TObject);
begin
  Listbox1.clear;
  listbox1.items.add('c:\1234\sfgg\avc.exe');
  listbox1.items.add('d:\abc\adsfsfgg\abc.exe.def');
  listbox1.items.add('e:\qwerty\sffsfgg\aec.exe');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: integer;
  st: string;
begin
  For i := 0 to Listbox1.items.count-1 do
  begin
    j := pos('abc.exe',Listbox1.items[i]); {søger efter abc.exe}
    if j <> 0 then
    Begin
      st := listbox1.items[i];
      delete(st,j+4,3); {sletter exe}
      insert('png',st,j+4); {indsætter png}
      listbox1.items[i] := st;
    end;
  end;
end;
Avatar billede challenger Nybegynder
29. oktober 2004 - 19:36 #13
Mange tak for hjælpen hreiff...
Dog måtte jeg ændre sidste linje til:
listbox1.Items.Add(st);
Men det er så ok :)
Nu har du jo fortjent dine points, men hvis du har lyst, kunne jeg godt tænke mig at den sletter noget, der står FØR noget også.

delete(st,j+4,3); {sletter abc. og lade exe stå tilbage} - hvis du forstår...

Sikkert meget simpelt, men nu er du jo i træning ;)
Så mon ikke også jeg kommer det igen! Det er næsten 4 år siden jeg sidst legede med Delphi, så der er mange ting der skal genopfriskes.
Endnu engang: Tak for din hjælp!
Avatar billede challenger Nybegynder
29. oktober 2004 - 19:40 #14
Pyt med den, det var jo nemt nok... *flov* :)
Avatar billede hreiff Nybegynder
29. oktober 2004 - 20:06 #15
Ja, det giver jo næsten sig selv.
delete(st,position af det der skal slettes, antal tegn der skal slettes)

Iøvrigt skal du holde lidt igen når du giver point. 200p er alt for meget for sådan noget som det her.
Avatar billede challenger Nybegynder
30. oktober 2004 - 15:42 #16
Ok, næste gang får du ikke så mange :)
Jeg har dog rigelig med point af dele ud af, så det betyder mindre for mig!
Desuden: Jo flere point man udlodder, jo mere hjælpsomme bliver folk... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester