Kod z każdego Timera będzie wykonywał się oddzielnie, ale nie w oddzielnych wątkach, więc gdy np. Timer1 będzie wykonywał kod, to Timer2 na ten czas zostanie wstrzymany.
Używanie tylu Timerów nie ma sensu, gdyż w Timerze chodzi tylko o zdarzenie OnTimer, które wykonuje się cyklicznie, więc wystarczy jeden Timer i jedno zdarzenie.
W przypadku Twojego kodu mogłoby to wyglądać tak:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
String odpowiedz1 = "No cześć.";
String odpowiedz2 = "A nic, nudzę się.";
if(Edit1->Text == "Cześć.")
{
Memo1->Text += odpowiedz1;
Edit1->Clear();
}
if (Edit1->Text == "Co robisz?.")
{
Memo1->Text += odpowiedz2;
Edit1->Clear();
}
Edit1->SetFocus();
Memo1->CaretPos=TPoint(99999, 99999);
}
Twój kod jest jednak zbyt prymitywny, by mógł z tego powstać jakiś sensowny chat. Trudno wszak zdefiniować jawnie wszystkie możliwe pytania i odpowiedzi.
Przedstawię prosty kod, który może stanowić wstęp do takiego programu:
String quote[] = {"Cześć.", "Co robisz?."};
String answer[] = {"No cześć.", "A nic, nudzę się."};
template <class M> void GoToLine(M *Obiekt, int line)
{
Obiekt->SelStart = Obiekt->Perform(EM_LINEINDEX, line - 1, 0);
Obiekt->SelLength = 0;
Obiekt->Perform(EM_SCROLLCARET, 0, 0);
Obiekt->SetFocus();
}
//------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if( !Edit1->Text.IsEmpty() )
{
for(int i = 0; i < ARRAYSIZE(quote); i++)
{
if( SameText(Edit1->Text, quote[i]) )
{
Memo1->Text += answer[i];
Edit1->Clear();
}
}
GoToLine(Memo1, Memo1->Lines->Count);
Edit1->SetFocus();
}
}
Używanie zegara nie ma jednak sensu, gdyż odpowiedź to Memo1 może się pojawić po zatwierdzeniu pytania w Edit1 np. po wciśnięci klawisza ENTER. Zauważ, że zegarem jest ten problem, iż podczas wpisywania tekstu do Edit1 warunek może zostać spełniony i zdarzenie OnTimer może wyczyścić zawartość Edit1 zanim użytkownik zada całe pytanie.