KIlka pytań o memo

0

Witam i sorry za może śmieszne pytanie ale ja sobie z tym nie radzę a mianowicie mam jakiś text w memo np:

Ala ma kota KOT jest zły ADAMA
Agata ma kota KOT jest zły Pawła
Kota ma Anna KOT jest zły TATY

1)Jak usunąć powiedzmy pierwsze 2 litery z każdej lini ??

  1. Jak usunąć text "nie wiadomo jaki długi bedzie w danej lini" po KOT aż do textu np ADAMA tak by wyszło :
    Było := Ala ma kota KOT jest zły ADAMA
    Ma być := Ala ma kota KOT ADAMA

Może wie ktoś gdzie znajdę po polsku pomoc do podobnych zagadnień ??

1
Copy
Delete
Pos

Z tym, że nie można robić czegoś takiego: ```delphi Delete(Memo1.Lines[0], 1, 2); ``` Tylko tak: ```delphi Var Line: String; {...} Line := Memo1.Lines[0]; Delete(Line, 1, 2); Memo1.Lines[0] := Line; ```
1
Patryk27 napisał(a):

Z tym, że nie można robić czegoś takiego:

Delete(Memo1.Lines[0], 1, 2);

No racja, można Memo1.Lines[0]:=Delete(Memo1.Lines[0], 1, 2);
To oczywiste jak to że Delete nie modyfikuje wejścia ale daje nowe wyjście.

Może wie ktoś gdzie znajdę po polsku pomoc do podobnych zagadnień ??

W googlach, ale dużo lepszej jakości będzie po angielsku. Jak chcesz programować to naucz się angielskiego.

0
-123oho napisał(a):

/.../ można Memo1.Lines[0]:=Delete(Memo1.Lines[0], 1, 2);

Nie można. Delete to procedura. Poza tym nie przyjmuje takiego parametru, jak słusznie zauważył Patryk27.

0

Można się uprzeć:

{$APPTYPE CONSOLE}
Uses SysUtils, Classes;
Var Str: TStringList;

Type TStringListHack = Class (TStrings)
                        Private
                         FList: PStringItemList;
                       End;

Begin
 Str := TStringList.Create;
 Str.Add('Hello World!');
 Writeln(Str[0]);
 Delete(PString(@TStringListHack(Str).FList^[0].FString)^, 1, 3);
 Writeln(Str[0]);
 Readln;
End.

Działa na Delphi 7.

W kwestii wytłumaczenia o co chodzi:
Delete wymaga zmiennej jako pierwszego argumentu.
Przekazując: Delete(Str[0], a, b) w rzeczywistości wywołujemy ukrytą metodę Get klasy TStringList, która zwraca string, ale nie zmienną tego typu.
PString(@TStringListHack(Str).FList^[0].FString)^
Właściwość FList jest dla klasy TStringList ukryta (tzn.jest w sekcji private):

  TStringList = class(TStrings)
  private
    FList: PStringItemList;
    FCount: Integer;
    FCapacity: Integer;
    FSorted: Boolean;

Korzystamy tutaj z haka, dzięki któremu możemy odczytać taką właściwość (pewnie na upartego da się także metody wywoływać) - tworzymy klasę TStringListHack, w której pierwszym polem jest FList (musi być to pierwsze pole, ponieważ jest ono pierwsze także w TStringList).
Potem rzutujemy TStringList na TStringListHack i odczytujemy pierwszy (zerowy) element FList i wyciągamy z niego FString, czyli ciąg znaków, który nas interesuje (FString w tym wypadku będzie na początku równe Hello World!) i go modyfikujemy.
Przypominam, że w przypadku Str[0] otrzymamy kopię niebędącą zmienną, której modyfikacja i tak nie zmodyfikowałaby tekstu w liście.

To tak w skrócie ;)


Co o tym myślicie? :D
0
pelsta napisał(a):
-123oho napisał(a):

/.../ można Memo1.Lines[0]:=Delete(Memo1.Lines[0], 1, 2);

Nie można. Delete to procedura. Poza tym nie przyjmuje takiego parametru, jak słusznie zauważył Patryk27.

Kolejny powód aby używać copy. Nigdy nie używałem Delete, chyba widać. Mój błąd, sry.

Delete(PString(@TStringListHack(Str).FList^[0].FString)^, 1, 3); a może łatwiej będzie copy?

0

Ale użycie Copy nie będzie takim haxiorskim rozwiązaniem :]
Edit: no i Copy to jednak nie do końca to samo, co Delete :P

0

OK
mamy := 'Ala lubi X do domu'
a jak usunąć wszystko do X by zostało 'do domu'

i czy jest jakaś procedura do usuwania z tekstu formy godzinowej tj np 17:30 , 12:11 mamy jakiś tekst np ' Ala ma lat 12 i musi iść o 12:30 do szkoły' tak by zostało ' Ala ma lat 12 i musi iść o do szkoły'

0
  1. Tu prosta sprawa bo masz stały tekst który ma zostać czyli "do domu"
s:= 'Ala lubi X do domu';
Delete(s, 1, Pos('do domu', s));
ShowMessage(s);
  1. Tu już może być różna godzina więc najlepiej użyć wyrażeń regularnych. W starszych Delphi trzeba dodać do uses moduł RegExpr do pobrania z http://regexpstudio.com/TRegExpr/TRegExpr.html
var
  RegExpr: TRegExpr;
  s: string;
begin
  s:= 'Ala ma lat 12 i musi iść o 12:30 do szkoły';
  RegExpr:= TRegExpr.Create;
  try
  RegExpr.Expression:= '[0-9]{2}:[0-9]{2}'; //godzina w formacie 00:00
  s:= RegExpr.Replace(s, '', False);
  ShowMessage(s);
  finally
  RegExpr.Free;
  end;
end;
0
kAzek napisał(a):
  1. Tu prosta sprawa bo masz stały tekst który ma zostać czyli "do domu"
s:= 'Ala lubi X do domu';
Delete(s, 1, Pos('do domu', s));
ShowMessage(s);
  1. Tu już może być różna godzina więc najlepiej użyć wyrażeń regularnych. W starszych Delphi trzeba dodać do uses moduł RegExpr do pobrania z
    end;


Nie to nie będzie sała ! a zmienna string  wiec nie wiem co bedzie pisać temu chce usunąć wszystko po np '#'   bo to zawsze bedzie w jednym miejscu wiec jest to mój punkt odniesienia

///
ups chyba śpię

s:=memo1.Lines.Strings[0]; := 'Ala lubi #  do domu'
Delete(s, 1, Pos('#', s));
ShowMessage(s); 'do domu'
0
B_R_U_T_U_S napisał(a):

Nie to nie będzie sała ! a zmienna string wiec nie wiem co bedzie pisać temu chce usunąć wszystko po np '#' bo to zawsze bedzie w jednym miejscu wiec jest to mój punkt odniesienia

///
ups chyba śpię

s:=memo1.Lines.Strings[0]; := 'Ala lubi # do domu'
Delete(s, 1, Pos('#', s));
ShowMessage(s);

Tak to zostało to po '#' aby usunąć to co po '#' trzeba:

  s:= 'Ala lubi X # do domu';
  s:= Copy(s, 1, Pos('#', s));
  ShowMessage(s);
0

Mam problem z procedurami mam kilka Ostatnia to If coś tam then coś tam

Procedury pod buttonem to :
wczytaj_druzyny_A;
wczytaj_druzyny_B;
wczytaj_pop;
Bramki;
Pisz_memo;
Over;
combo;
Algorytm_over;
////////////////////
czemu muszę kliknąć 2 razy na butona by zadziałało Algorytm_over; reszta działa po 1 kliknięciu a to procedura :

procedure Algorytm_over;
Var a:integer;
Begin

If p.Ilosc = 0 then a:=1;

if p.Ilosc = 1 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.srednia:=p.Bram_A1+p.Bram_a2;
End;

if p.Ilosc = 2 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2 ;
End;

if p.Ilosc = 3 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
p.Bram_c1 :=StrToCurr(Form1.Memo11.Lines.Strings[2]);
p.Bram_c2:= StrToCurr(Form1.Memo12.Lines.Strings[2]);
p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2+p.Bram_c1+p.Bram_c2 ;
End;

if p.Ilosc = 4 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
p.Bram_c1 :=StrToCurr(Form1.Memo11.Lines.Strings[2]);
p.Bram_c2:= StrToCurr(Form1.Memo12.Lines.Strings[2]);
p.Bram_d1 :=StrToCurr(Form1.Memo11.Lines.Strings[3]);
p.Bram_d2:= StrToCurr(Form1.Memo12.Lines.Strings[3]);
p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2+p.Bram_c1+p.Bram_c2+
p.Bram_d1+p.Bram_d2 ;
End;

if p.Ilosc = 5 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
p.Bram_c1 :=StrToCurr(Form1.Memo11.Lines.Strings[2]);
p.Bram_c2:= StrToCurr(Form1.Memo12.Lines.Strings[2]);
p.Bram_d1 :=StrToCurr(Form1.Memo11.Lines.Strings[3]);
p.Bram_d2:= StrToCurr(Form1.Memo12.Lines.Strings[3]);
p.Bram_e1 :=StrToCurr(Form1.Memo11.Lines.Strings[4]);
p.Bram_e2:= StrToCurr(Form1.Memo12.Lines.Strings[4]);
p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2+p.Bram_c1+p.Bram_c2+
p.Bram_d1+p.Bram_d2+p.Bram_e1+p.Bram_e2 ;
End;

if p.Ilosc = 6 then
begin
p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
p.Bram_c1 :=StrToCurr(Form1.Memo11.Lines.Strings[2]);
p.Bram_c2:= StrToCurr(Form1.Memo12.Lines.Strings[2]);
p.Bram_d1 :=StrToCurr(Form1.Memo11.Lines.Strings[3]);
p.Bram_d2:= StrToCurr(Form1.Memo12.Lines.Strings[3]);
p.Bram_e1 :=StrToCurr(Form1.Memo11.Lines.Strings[4]);
p.Bram_e2:= StrToCurr(Form1.Memo12.Lines.Strings[4]);
p.Bram_f1 :=StrToCurr(Form1.Memo11.Lines.Strings[5]);
p.Bram_f2:= StrToCurr(Form1.Memo12.Lines.Strings[5]);
p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2+p.Bram_c1+p.Bram_c2+
p.Bram_d1+p.Bram_d2+p.Bram_e1+p.Bram_e2+p.Bram_f1+p.Bram_f2 ;
End;

End;

0

Sformatuj kod po ludzku i wstaw w odpowiednie tagi to może ktoś spojrzy. Ja tam widzę tylko masę Memo. Jeżeli nie musi te dane widzieć user to użył bym TStringList do tego jeśli już. Poza tym podejrzewam, że te if'y da się zrobić jako case i również je uprościć. Poza tym najlepiej przeanalizuj co się dzieje z kodem pod Debuggerem.

0

Matko Boska!

Form1.Memo11.Lines.Strings[0]

Strings to default property, tak więc wystarczy Lines[x].

p.Bram_a1 :=StrToCurr(Form1.Memo11.Lines.Strings[0]);
 p.Bram_a2:= StrToCurr(Form1.Memo12.Lines.Strings[0]);
 p.Bram_b1 :=StrToCurr(Form1.Memo11.Lines.Strings[1]);
 p.Bram_b2:= StrToCurr(Form1.Memo12.Lines.Strings[1]);
 p.Bram_c1 :=StrToCurr(Form1.Memo11.Lines.Strings[2]);
 p.Bram_c2:= StrToCurr(Form1.Memo12.Lines.Strings[2]);
 p.Bram_d1 :=StrToCurr(Form1.Memo11.Lines.Strings[3]);
 p.Bram_d2:= StrToCurr(Form1.Memo12.Lines.Strings[3]);
 p.Bram_e1 :=StrToCurr(Form1.Memo11.Lines.Strings[4]);
 p.Bram_e2:= StrToCurr(Form1.Memo12.Lines.Strings[4]);
 p.Bram_f1 :=StrToCurr(Form1.Memo11.Lines.Strings[5]);
 p.Bram_f2:= StrToCurr(Form1.Memo12.Lines.Strings[5]);
 p.srednia:=p.Bram_A1+p.Bram_a2+p.Bram_b1+p.Bram_b2+p.Bram_c1+p.Bram_c2+
 p.Bram_d1+p.Bram_d2+p.Bram_e1+p.Bram_e2+p.Bram_f1+p.Bram_f2 ;

Po to są tablice, aby nie robić takich dziwnych rzeczy.
Dodatkowo obliczanie średniej wrzuciłbym do osobnej funkcji.

Ogólnie cały program jest źle zaprojektowany, jeżeli musisz takie rzeczy robić.

1

czemu muszę kliknąć 2 razy na butona by zadziałało Algorytm_over

Jest parę przyczyn:

  1. Jesteś tępy co objawia się np. nie czytanie wskazówek przy tworzeniu nowego tematu gdzie jest wyraźnie napisane w co się wstawia kod.
  2. Nie ułatwiasz sobie zadania używając strasznie skomplikowanych struktur w stylu tablic.
  3. Nie ułatwiasz sobie zadania używając debuggera.
  4. Sądzisz że będziemy wchodzić w temat w którym już zaakceptowano odpowiedź. No zobacz, tutaj akurat się nie mylisz, co nie zmienia faktu że JEDNO PYTANIE JEDEN TEMAT.
0

ciekawe czy w realu byś mi to leszczu w oczy powiedział robie jak mi wygodnie , jeśli pytam to mam powód nie oczekuje zrobienia czegoś za mnie ale licze że ktoś pomoże

0

ciekawe czy w realu byś mi to leszczu w oczy powiedział robie jak mi wygodnie

Leszczem to możesz nazywać co najwyżej siebie. I niestety, zmartwię Cię, ale da się zrobić wygodniej tylko właśnie tobie jest wygodniej gdy jest mniej wygodnie. No ale Ty wiesz lepiej :) .

B_R_U_T_U_S napisał(a):

jeśli pytam to mam powód nie oczekuje zrobienia czegoś za mnie ale licze że ktoś pomoże

Pomóż sam sobie ucząc się tego co wymieniłem poprzednio.

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