Odczytywanie wiadomości z bazy

0

Programuje właśnie komunikator. Mam w timerze sprawdzanie nowych wiadomości(thread):

procedure recmess.Execute;
begin





   for i := 0 to (Form3.contacts.Items.Count - 1) do
      if Form3.contacts.Selected[i] = true then
          Form3.messages.ParamByName('t').AsString := Form3.contacts.items[i];


  Form3.messages.ParamByName('l').AsString := Form1.polelogin.Text;
     Form3.messages.Open;

     while not Form3.messages.eof do
      begin


     if (Form3.messages.FieldByName('from').asstring) = (Form1.polelogin.text) then


  Form3.talk.Lines.Add(Form1.polelogin.Text + ': ' + Form3.messages.FieldByName('message').asstring);



     if ((Form3.messages.FieldByName('from').asstring) = (Form3.contacts.Items[i])) then

       Form3.talk.Lines.Add(Form3.contacts.Items[i] + ': ' + Form3.messages.FieldByName('message').asstring);

  Form3.messages.Next;

  end;
   Form3.messages.Close;
end; 

Niestety ta procedura pokazuje tylko pierwsza wiadomość z tabelki.

beztytuukrd.png

Kod SQL jest taki:

SELECT * 
FROM `messages` 
WHERE (`from` = :l OR `from` = :t) AND (`to` = :l OR `to` = :t) AND `read` = 1

Proszę o pomoc

0

wybacz ze nie na temat (chociaz nie wiadomo) ale: to jest w wątku? nie wolno sie odwolywac do VCL w watkach, nie w ten sposob! synchronize()!

0

wybacz ze nie na temat (chociaz nie wiadomo) ale: to jest w wątku? nie wolno sie odwolywac do VCL w watkach, nie w ten sposob! synchronize()!

To mój pierwszy program w Delphi, i w ogóle tak skomplikowany, jednakże nie zauważyłem żadnych problemów wynikających z odwołań do VLC(no poza tym, że nie da się utworzyć nowej formy z wątku)

0

nie zauwazyles, bo blad pojawi sie dopiero w momencie gdy dwa watki (Twoj, oraz watek glowny programu) beda sie probowaly odwolac, w tym samym czasie, do tego samego komponentu. kwestia czasu az to "wylezie".

0

No dobrze, a poza tym, treść wątku jest poprawna?

0

hmm.. bazami sie nigdy jakos mocno nie zajmowalem, ale.. czy zapytanie ma byc wywolywane dla wszystkich zaznaczonych kontaktow, czy tylko dla ostatniego?:)

0

W TListEdit można wybrać tylko jeden element.

0

a ok. ale chyba wiem..:
poza pętlą for, "i" bedzie zawsze równe:

Form3.contacts.Items.Count - 1

a tam w petli while masz sprawdzanie:

if ((Form3.messages.FieldByName('from').asstring) = (Form3.contacts.Items[i])) then

wiec w petli while, w warunku porownujesz zawsze z ostatnim kontaktem z listy a nie z tym wybranym.
z reszta, wydaje mi sie ze zamiast dawac dwa warunki if, w while, wystarczy if then else, bez sprawdzania drugiego warunku.
jak nie, to mozesz dodac albo nowa zmienna i do niej zapisywac index zaznaczonego kontaktu, albo zwyczajnie w petli for dac "break" w momencie gdy natkniesz sie na zaznaczony kontakt.

0

Miałeś rację.
WIELKIE DZIĘKI!!!!!!!!!

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