Problem z kolorowaniem Memo

0

Witam was serdecznie.
Zacząłem się uczyć Delphi, jako że mam do napisania w nim projekt zaliczeniowy.
Polega on na pokazaniu w quicksorcie, który element z którym jest porównywany i zamieniany.
Mój problem polega na tym, że polecenie typu memo.color:=costam; działa, ale tylko jeśli po tym daję polecenie showmessage('cos');. Jeśli zamiast tego dam sleep(1500);, to już kolorowania nie widzę :/ Bardzo mi zależy na tym, żebym mógł zastosować sleep, bo wtedy będzie widać ładnie, który z którym jest porównywany.
Mam 20 obiektów typu memo, w każdym z nich jest inna liczba

Oto część kodu, w którym widać problem:

function przydziel(i: integer): TMemo;
var
  aMemo: TMemo;
begin
  aMemo:=Form1.input;
  case i of
		1: aMemo := Form1.Memo1;
		2: aMemo := Form1.Memo2;
		3: aMemo := Form1.Memo3;
		4: aMemo := Form1.Memo4;
		5: aMemo := Form1.Memo5;
		6: aMemo := Form1.Memo6;
		7: aMemo := Form1.Memo7;
		8: aMemo := Form1.Memo8;
		9: aMemo := Form1.Memo9;
		10: aMemo := Form1.Memo10;
		11: aMemo := Form1.Memo11;
		12: aMemo := Form1.Memo12;
		13: aMemo := Form1.Memo13;
		14: aMemo := Form1.Memo14;
		15: aMemo := Form1.Memo15;
		16: aMemo := Form1.Memo16;
		17: aMemo := Form1.Memo17;
		18: aMemo := Form1.Memo18;
		19: aMemo := Form1.Memo19;
		20: aMemo := Form1.Memo20;
  end;
  przydziel:=aMemo;
end;

procedure domysl(aMemo : TMemo);
begin
  aMemo.Color:=ClHighlight;
end;

procedure quicksort(lewy, prawy : integer);
var
  i, j: integer;
  x, pivot: extended;
  aMemo, bMemo, cMemo: TMemo;
  s: string;
  kolor: TColor;
begin
  i := (lewy + prawy) div 2;
  //showmessage('pivot na miejscu '+inttostr(i));
  pivot := tablica[i];
  aMemo:=przydziel(i);
  aMemo.Color:=ClTeal;
  tablica[i] := tablica[prawy];
  bMemo:=przydziel(prawy);
  bMemo.Color:=ClTeal;
  //Tu np jest problem - jak zakomentuję sleep, a odkomentuję showmessage, to widzę zmianę kolorów,a tak nie
  sleep(2000);
  //showmessage('zamiana');
  s:=aMemo.lines.text;
  aMemo.Lines.text:=bMemo.lines.Text;
  bMemo.lines.Text:=s;
  sleep(1500);
  aMemo.Color:=clBtnFace;
  bMemo.Color:=clBtnFace;
  j := lewy;
  for i := lewy to prawy - 1 do
    begin
    bMemo:=przydziel(i);
    bMemo.Color:=ClWhite;
    if tablica[i] < pivot then
      begin
        cMemo:=przydziel(j);
        kolor:=cMemo.color;
        cMemo.Color:=ClWhite;
        x := tablica[i];
        //showmessage('nr '+inttostr(i)+' jest mniejszy od '+floattostr(pivot));
        tablica[i] := tablica[j];
        tablica[j] := x;
        bMemo.Color:=clLime;
        //cMemo.Color:=clLime;
        //showmessage('mniejsze,i='+inttostr(i));
        sleep(1500);
        s:=bMemo.Lines.Text;
        bMemo.Lines.Text:=cMemo.Lines.Text;
        cMemo.Lines.Text:=s;
        cMemo.Color:=kolor;
        inc(j);
      end
    else
      begin
      bMemo:=przydziel(i);
      bMemo.Color:=ClSkyBlue;
      //showmessage('wieksze od '+floattostr(pivot)+', i='+inttostr(i));
      sleep(1500);
      //bMemo.Color:=clBtnFace;
      end
    end;
  bMemo:=przydziel(prawy);
  bMemo.Color:=ClRed;
  cMemo:=przydziel(j);
  cMemo.Color:=ClRed;
  tablica[prawy] := tablica[j];
  tablica[j] := pivot;
  //showmessage('zamiana, pivot idzie na miejsce '+inttostr(j)+', a nr '+inttostr(prawy)+' ma wartosc nr '+inttostr(j));
  bMemo.Lines.Text:=cMemo.Lines.Text;
  cMemo.Lines.Text:=FloatToStrF(pivot,ffFixed,6,4);
  sleep(1500);
  bMemo.Color:=clBtnFace;
  cMemo.Color:=clBtnFace;
  if lewy < j - 1  then
    begin
    //showmessage('ok1, j='+inttostr(j)+',lewy='+inttostr(lewy));
    for i:=lewy to j-1 do
      begin
      aMemo:=przydziel(i);
      aMemo.color:=ClBtnFace;
      end;
    quicksort(lewy, j - 1);
    end;
  if j + 1 < prawy then
    begin
    //showmessage('ok2, j='+inttostr(j)+',prawy='+inttostr(prawy));
    for i:=j+1 to prawy do
      begin
      aMemo:=przydziel(i);
      aMemo.color:=ClBtnFace;
      end;
    quicksort(j + 1, prawy);
    end;
end;
1

Daj memo.repaint(), memo.refresh(), application.processmessages(), memo.update(), form.repaint(), etc... (nie wiem czy akurat w Delphi istnieja repaint() i refresh(), ale sprawdz ;) ) - ktores z nich powinno odmalowac Ci memo i dopiero po tym wywoluj sleep().

P.S.
Wystarczy jedno z wymienionych, sprawdz ktore.

0
function przydziel(i: integer): TMemo;
var
  aMemo: TMemo;
begin
  aMemo:=Form1.input;
  case i of
                1: aMemo := Form1.Memo1;
                2: aMemo := Form1.Memo2;
                3: aMemo := Form1.Memo3;
                4: aMemo := Form1.Memo4;
                5: aMemo := Form1.Memo5;
                6: aMemo := Form1.Memo6;
                7: aMemo := Form1.Memo7;
                8: aMemo := Form1.Memo8;
                9: aMemo := Form1.Memo9;
                10: aMemo := Form1.Memo10;
                11: aMemo := Form1.Memo11;
                12: aMemo := Form1.Memo12;
                13: aMemo := Form1.Memo13;
                14: aMemo := Form1.Memo14;
                15: aMemo := Form1.Memo15;
                16: aMemo := Form1.Memo16;
                17: aMemo := Form1.Memo17;
                18: aMemo := Form1.Memo18;
                19: aMemo := Form1.Memo19;
                20: aMemo := Form1.Memo20;
  end;
  przydziel:=aMemo;
end;

Za dużo, za dużo...Stack overflow...Proszę czekać...
Ok, już jestem. Użyj tego kodu:

function przydziel(i: integer): TMemo;
begin
  przydziel:=TMemo(Form1.FindComponent('Memo'+I));
end;
0

Panowie, dziękuję Wam, zaczęło działać super :D Powiedzcie mi jeszcze tylko, czy macie pomysł, na podstawie jakich bibliotek i poleceń mógłbym przesuwać okna Memo, żeby pokazać przemieszczanie się elementów? Albo jakiś inny pomysł na pokazanie tego przemieszczania?

0

Do przesuwania komponentów na ogół nie są potrzebne żadne biblioteki. Zmieniasz tylko własności Left i Top komponentu.

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