Wątek przeniesiony 2014-07-30 23:16 z Delphi i Pascal przez olesio.

Nieprawidłowe zwrócenie fragmentu tekstu względem separatora przy użyciu funkcji Copy.

0

Witam,
mam problem z funkcją COPY.
Otóż mam w bazie w jednym rekordzie wpisane dane po przecinku, i chcę je wyodrębnić do osobnych rekordów
np Ala, Ma, Kota do
Ala
Ma
Kota

 
procedure Tslownik_podczas_pracy.Button3Click(Sender: TObject);
begin
SetLength(Tab, 80);
poczatek:=1;
numer:=0;

while not(DBGrid1.DataSource.DataSet.Eof) do
begin
  DBGrid1.SelectedRows.CurrentRowSelected := True;

 memo3.Clear;
if not(DBGrid1.DataSource.DataSet.Fields[1].IsNull) then
  begin
        Memo3.Lines.Add(DBGrid1.Fields[1].ASString);
        //
        sText := Memo3.Lines.Text; // caly text
        koniec := Length(sText);    // dlugosc calego tekstu
        for I := 0 to koniec do
        begin
         przecinek:=(Pos(',',sText)); // podaje pozycje pierwszego przecinka
          if not(przecinek=0) then   //jezeli przecinek jest
          begin
            Delete(sText,przecinek,1);  // usuwam przecinek

            Tab[numer]:=copy(sText,poczatek,przecinek);   // od poczatku do przecinka kopiuje wyraz do tablicy

            poczatek:=przecinek+1; // nowy poczatek po przecinku

            numer:=numer+1;
          end;
          // jezeli ostatni wyraz to go kopiujemy do Tablicy
          if(i=koniec) then
          begin
                Tab[numer]:=copy(stext,poczatek,koniec);
          end;

        end;
        poczatek:=1;
        numer:=0;
  end;

DBGrid1.SelectedRows.CurrentRowSelected := False;
DBGrid1.DataSource.DataSet.next;
end;
end;

Pierwszy wyraz zwraca poprawnie: Ala
Drugi wyraz nie wiem czemu zwraca: Ma Kota
Ostatni wyraz zwraca poprawnie Kota

Może to jakieś przeoczenie albo źle to robię ale męczę się i nie mogę sobie poradzić.
Proszę o pomoc.

2

Pewnie dlatego kod działa źle, ponieważ nie znasz podstaw. Nie reagujesz chyba ok na brak separatora. Anyway. Twój kod nie jest sformatowany, więc nie ma sensu wytrzeszczać oczu i go analziowac. Spróbuj taki kod jak poniżej. Ewentualnie pozmieniaj go sobie na wyłuskiwanie części w procedurze - zdarzeniu albo do jakiejś tablicy. Jakby "bazę do kombinacji" już masz.

I nie wiem dlaczego uparcie temat nie w Newbie? Tam przenoszę. Ponieważ używanie Pos i Copy czy Delete to przecież naprawdę banalne podstawy.

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if (Length(Str) > 0) then
  begin
    Result.Add(Str);
  end;
end;
0

@Kazik1 - napisz co znajduje się w memo po wykonaniu tej instrukcji:

Memo3.Lines.Add(DBGrid1.Fields[1].ASString);

bo coś mi się wydaje, że tekst w komponencie masz podzielony, a później niepotrzebnie łączysz go w jeden łańcuch, aby potem znów go podzielić.

0

@furious programming
Tam jest wpisywany rekord z kolumny, który chce rozdzielić.
A wynik wpisuje do tablicy Tab.

Dobra, już zrozumiałem.
Ale czasu poświęciłem... gafa.

0

Tam jest wpisywany rekord z kolumny, który chce rozdzielić.

No dobrze, tyle że instrukcję niżej robisz przypisanie całej zawartości komponentu do zmiennej, na której wykonujesz dalsze działania:

Memo3.Lines.Add(DBGrid1.Fields[1].ASString);
//
sText := Memo3.Lines.Text; // caly text

więc pasowałoby pokazać zawartość zmiennej sText, żeby móc cokolwiek sensownie doradzić; Wyżej dostałeś przykład ekstrahowania podciągów, ale dla jednej linii; Twoje przypisanie całego tekstu z memo do zmiennej może dawać łańcuch, który trudniej będzie rozdzielić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1