Limit linii w memo

0

Witam
W pliku tekstowym jest coś takiego:

1
2
3
4
5
6
7
8
9
10

i jak zrobić żeby po naciśnięciu buttona1 załadowało do memo tylko 4 albo 5 itd??
Chodzi o to że wartość ile ma załadować będzie sie wpisywało do edit1 i jak pisze tam 3 to załaduje tylko 3 linie do memo

0

załadować ręcznie a nie przez LoadFromFile

0

albo inaczej, jak po naciśnięciu guzika załadowało z pliku tekstowego tylko np 3 czy 4 linijki do memo?

0

DOKŁADNIE TAK SAMO

0

widze że mało tu fachowców. Udało mi się to zrobić:

procedure TForm1.Button1Click(Sender: TObject);
var
myFile : TextFile;
text : string;
i, j : Integer;
begin
AssignFile(myFile, 'w.txt');
Reset(myFile);
i := StrToInt(edit1.Text);
j := 0;
while not Eof(myFile) do
begin
if j < i then begin
ReadLn(myFile, text);
memo1.Lines.Add(text);
end;
j := j + 1;
end;

// Close the file for the last time
CloseFile(myFile);

1

Udało mi się to zrobić

Gratuluje.

widze że mało tu fachowców.

oj tak tak, problem wszystkich przerósł ;]

0

// Close the file for the last time

O! Potrafisz używać Google :>

0

@blecho: gratuluję umiejętności używania google, a co do fachowców - to uwierz
mi, że o wiedzy oraz doświadczeniu usera MisiekD, Ty możesz jedynie pomarzyć.

0

Nie wątpie. Ja jestem laikiem
A co Pan Misiek wie o delphi split string. Chodzi mi o to, że w Delphi w memo jest zapisane takie coś:

"jeden dwa" - w jednej lini
i po naciśnięciu buttona "jeden" ma być wysłane do label1 a "dwa" do "label2".
W PHP to sie explode nazywa czy jakoś tak a w dephi split string i jak je podzielić naprawde robiłem wszystko

0

A google to kto Tobie zabronil używać? Chcesz mieć Explode jak w php, proszę bardzo:

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;

Pierwszy element będzie w stringlistcie o indeksie [0], drugi w [1] i tak dalej,
A jakbyś sam pogooglowal to byś znalazł taki artykuł w FAQ na tym serwisie:
Jak rozdzielić łańcuch tekstowy wg. jakiegoś znaku

Inny sposób najprostszy chyba i bez stosowania niestandardowych modułów,
o ile chcemy rozdzeliać według jednego konkretnego znaku - czyli np. spacji.

var
  SL : TStringList;
begin
  SL := TStringList.Create;
  SL.Delimiter := #32;
  SL.DelimitedText := Memo1.Text;
  if SL.Count = 2 then
  begin
    Label1.Caption := SL[0];
    Label2.Caption := SL[1];
  end;
  SL.Free;
end;

Ale wiadomo najlepiej narzekać, że na forum nie ma specjalistów, niż chwilę
pomyśleć i pokombinować SAMODZIELNIE. Uwierz mi - to naprawę nie boli.
Bo funckja SplitString dzieli nam tekst na dwie zmienne, na lewo i na prawo
od podanego Tokena. Poza tym z takimi banałami, to pisz do działu Newbie.

0

Wytrzymaj do pierwszej sesji Olesio, jak nastąpi odsiew to od razu będzie lżej :>

0

proszę bardzo jaśnie panie

function ExpandString(str: string; Delimiter: char): TStrings;
var
  P, P1: PChar;
  S: string;
begin
  Result := TStringList.Create;
  Result.BeginUpdate;
  try
    Result.Clear;
    P := PChar(str);
    while P^ in [#1..#31] do
    {$IFDEF MSWINDOWS}
      P := CharNext(P);
    {$ELSE}
      Inc(P);
    {$ENDIF}
    while P^ <> #0 do
    begin
      if P^ = '"' then
        S := AnsiExtractQuotedStr(P, '"')
      else
      begin
        P1 := P;
        while (P^ > #31) and (P^ <> Delimiter) do
        {$IFDEF MSWINDOWS}
          P := CharNext(P);
        {$ELSE}
          Inc(P);
        {$ENDIF}
        SetString(S, P1, P - P1);
      end;
      Result.Add(Trim(S));
      while P^ in [#1..#31] do
      {$IFDEF MSWINDOWS}
        P := CharNext(P);
      {$ELSE}
        Inc(P);
      {$ENDIF}
      if P^ = Delimiter then
      begin
        P1 := P;
        {$IFDEF MSWINDOWS}
        if CharNext(P1)^ = #0 then
        {$ELSE}
        Inc(P1);
        if P1^ = #0 then
        {$ENDIF}
          Result.Add('');
        repeat
          {$IFDEF MSWINDOWS}
          P := CharNext(P);
          {$ELSE}
          Inc(P);
          {$ENDIF}
        until not (P^ in [#1..#31]);
      end;
    end;
  finally
    Result.EndUpdate;
  end;
end;

@olesio z używaniem DelimitedText uważaj, bo możesz się przejechać. W SetDelimitedText jest warunek, że jeśli znak jest <= #32 lub = Delimiter to następuje podział. Problem zaczyna się jeśli twoim delimiterem nie jest spacja i nie chcesz aby na spacji rozdzielał to kupa. Powyżej to przerobione SetDelimitedText tak, aby nie brał pod uwagę spacji (ale bierze wszystkie znaki < #32).

A i to ExpandString jest szybsze od tego, które podałeś :p

0

Dzięki za pomoc. I nie uważam się za guru bo jestem noobem w porównaniu z Wami. Delphi to nie moje środowisko ale musze zrobić jeden program w Delphi.
Mój ostatni problem polega na tym że skoro już wiem jak zrobić, że po naciśnięciu buttona z memo "jeden dwa" wysyła do Label1 i Label2 to teraz chodzi mi o to:
w memo jest lista:

"jeden dwa"
"trzy cztery"
"pięć sześć"

i za każdym naciśnięciem buttona znika "jeden dwa", pojawia się następne "trzy cztery" potem "pięć sześć"
w SPACJA końcu jak w memo już się skończy lista to i guzik nie zadziała, jak to zrobić bo się gubie od rana

0

O takie coś jak poniżej chodzi?

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;

procedure TForm1.Button1Click(Sender: TObject);
var
  S : string;
  SL : TStringList;
begin
  if Memo1.Lines.Count > 0 then
  begin
    S := Memo1.Lines[0];
    SL := Explode(S, #32);
    Label1.Caption := SL[0];
    Label2.Caption := SL[1];
    Memo1.Lines.Delete(0);
    SL.Free;
  end;
end;

A jak nie chcesz usuwać z Memo to wcześniej pobierz Tekst Memo do
utworzonej StringListy, jako zmiennej globalnej i z niej usuwaj linijki.

0

@olesio
Czemu mu wszystko piszesz? Potem wychodzą po studiach "informatycy" na papierku, którzy głównie nadają się na kasę do tesco lub meblowego. :]

0

Dzięki za pomoc. Nie jestem studentem informatyki, i zapewne normalny student infy by mi w tym nie pomógł dlatego prosiłem Was:) Dzięks

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