Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Add Leerzeichen nach gelöschten POS? (https://www.delphipraxis.net/68439-add-leerzeichen-nach-geloeschten-pos.html)

danku 29. Apr 2006 14:46


Add Leerzeichen nach gelöschten POS?
 
wie kann ich erreichen das die komplette stringgrid "durchcompiliert" wird und die leerzeichen gelöscht werden?

Delphi-Quellcode:
if rgmenue.ItemIndex = 0
      then begin

      PROBLEM 1

      for i:= 0 to 1000 do //Komplett search_text in Zelle gelöscht ->beschleunigt abschnittsw. l.
            begin
            Position := 1;
            S := sgfiles.Cells[0,1];          
              for zaehlen := 0 to length(S) do //search_text abschnittsweise löschen
                begin
                //Position des Search_Text ('_')
                  Position := GetPosNumX(Search_Text, S, Position);
                //Löscht diese Stelle
                  Delete(S, Position, length(Search_Text));

                  PROBLEM 2

                  end;
              sgfiles.Cells[0,1]:= S;
              inc(a,i);
              end;

              ///// Löschen
              for i:= 0 to 1000 do
                begin
                Position := 1;
                S := sgfiles.Cells[0,1];

                  for zaehlen := 0 to length(S) do
                    begin
                      Position := GetPosNumX(Search_Text, S, Position);
                      Delete(S, Position, length(Search_Text));

                      end;
                  sgfiles.Cells[0,1]:= S;
                  inc(a,i);
                  end;
problem1:
Es wird jeweils zuerst nur in der Zelle nach dem (Search_Text = '_') gesucht und dieser gelöscht. aber das passiert nur abschnittsweise. und nicht in der gesamten zelle komplett.

problem2:
wäre es besser eine replace-prozedur zur schreiben, um '_' durch '' zu ersetzen oder doch lieber bei meiner jetzigen variante und dann noch nach dem löschen ein leerzeichen dazuzufügen?

himitsu 29. Apr 2006 16:57

Re: Jump to Next Zeile // Replace Prozedur oder Add Leerzeic
 
Ich hoffe doch mal das GetPosNumX soll sowas wie PosEx sein?

dann würde ich dir mal raten dieses
Delphi-Quellcode:
for zaehlen := 0 to length(S) do
in
Delphi-Quellcode:
for zaehlen := length(S) downto 1 do
Zeichen 0 wird's nicht geben
und wenn du löschts, dann verändert sich die Länge (daher rückwärts zählen)

und das ganze:
Delphi-Quellcode:
for zaehlen := 0 to length(S) do
begin
  Position := GetPosNumX(Search_Text, S, Position);
  Delete(S, Position, length(Search_Text));
end;
wobei es wohl so efektiver wäre (obwohl StringReplace wohl wirklich besser wär):
Delphi-Quellcode:
Position := Pos(Search_Text, S);
while Position > 0 do
begin
  Delete(S, Position, length(Search_Text));
  Position := PosEx(Search_Text, S, Position + 1);
end;

marabu 29. Apr 2006 17:34

Re: Jump to Next Zeile // Replace Prozedur oder Add Leerzeic
 
Hi.

Damit auch wirklich jede Zelle untersucht wird, musst du natürlich auch den Spalten- und Zeilenindex richtig setzen:

Delphi-Quellcode:
procedure StringGridReplace(sg: TSTringGrid; const sFrom, sTo: String);
var
  iCol, iRow: Integer;
begin
  with sg do
    for iCol := FixedCols to Pred(ColCount) do
      for iRow := FixedRows to Pred(RowCount) do
        Cells[iCol, iRow] := ReplaceAll(Cells[iCol, iRow], sFrom, sTo);
end;
Statt meiner Funktion ReplaceAll() kannst du auch StringReplace() aus der Unit SysUtils verwenden.

Grüße vom marabu

Nachtrag: Falls es mal wieder länger dauert ist ReplaceAll() vielleicht doch schneller:

Delphi-Quellcode:
// uses Types;

function ReplaceAll(const s, sFrom, sTo: String): String;
var
  ida: TIntegerDynArray;
  i, iIn, iOut, iPos, iLength: Integer;
begin
  ida := FindAll(s, sFrom);
  iLength := Length(s) + Length(ida) * (Length(sTo) - Length(sFrom));
  SetLength(Result, iLength);
  iIn := 1;
  iOut := 1;
  for i := Low(ida) to High(ida) do
  begin
    iPos := ida[i];
    iLength := iPos - iIn;
    Move(s[iIn], Result[iOut], iLength);
    Inc(iOut, iLength);
    Move(sTo[1], Result[iOut], Length(sTo));
    Inc(iOut, Length(sTo));
    Inc(iIn, iLength + Length(sFrom));
  end;
  if iIn <= Length(s) then
    Move(s[iIn], Result[iOut], Succ(Length(s) - iIn));
end;
Und hier noch FindAll():

Delphi-Quellcode:
// uses Types, StrUtils;

function FindAll(const s, substr: String): TIntegerDynArray;
var
  iPos: Integer;
begin
  SetLength(Result, 0);
  iPos := 1;
  repeat
    iPos := PosEx(substr, s, iPos);
    if iPos > 0 then
    begin
      SetLength(Result, Succ(Length(Result)));
      Result[High(Result)] := iPos;
      Inc(iPos, Length(substr));
    end
  until iPos = 0;
end;

danku 30. Apr 2006 10:05

Re: Jump to Next Zeile // Replace Prozedur oder Add Leerzeic
 
jo vielen dank für die schnelle antwort.
das das problem so komplex ist hätte ich nicht gedacht :cyclops:
merci :thumb:
wenn das proggie fertig ist :coder: werde ich euch zuerst schicken wenn ihr wollt

Edit: Woran liegt das eigentlich, sobald man opendialog1.filename schreibt,
dass der ganze pfad aufgelistet wird? :gruebel:

bsp: drum_n_bass.mp3 ausgewählt per opendialog
D:\Musik\drum_n_bass.mp3 wird in die stringgrid übernommen

Klaus01 30. Apr 2006 15:40

Re: Add Leerzeichen nach gelöschten POS?
 
weil das so definiert ist:

Auszug aus der Delphi Hilfe:

Zitat:

property FileName: TFileName;

Description

The FileName property returns the name and complete directory path of the most recently selected file. The value of FileName is the same as the first item in the Files property.
Wenn Du nur den Filenamen haben willst, mußt Du in extrahieren.
Dazu findest Du hier aber mindestens einen Thread der sich damit beschäftigt.

Grüße
Klaus

marabu 30. Apr 2006 18:14

Re: Add Leerzeichen nach gelöschten POS?
 
Du suchst ExtractFileName():

Delphi-Quellcode:
begin
  if ExtractFileName('D:\Musik\drum_n_bass.mp3') = 'drum_n_bass.mp3' then
    ShowMessage('na bitte - geht doch');
end;
marabu

danku 1. Mai 2006 11:46

Re: Add Leerzeichen nach gelöschten POS?
 
und wie kann ich erreichen das man den pfad weg bekommt?
ich will doch nur in die zellen die audiodateien ohne den pfad.

Hawkeye219 1. Mai 2006 11:52

Re: Add Leerzeichen nach gelöschten POS?
 
Hallo danku,

marabu hat dir die Funktion doch bereits genannt. Hast du schon in der Online-Hilfe nachgesehen, was die Funktion Delphi-Referenz durchsuchenExtractFileName macht?

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.

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