Kilka problemów [komunikator]

0

Witam...

Mam mały problem ;)

Mam listboxa i są na nim użytkownicy tak jak np. w gg, po zaznaczeniu użytkownika i podwójnym kliknięciu chciałbym aby otwarło się okienko dla danego uzytkownika oraz to aby w tym okienku jak bedzię się chciało wysłać tekst, żeby on trafił do tej osoby, chodzi o sockety ;)
jak to zrobić??

ps. mam nadzieję że mi to ktoś jasno wyjaśni, aaaha zapomniałbym dodać że jestem początkujący :)

pozdrawiam

0

Hmm... Początkująca osoba zabiera się za pisanie komunikatora... No dobra, jak chcesz, to próbuj, ale może to spowodować zrażenie się do pisania programów... A pytanie numer jeden: Czy masz serwer do tego komunikatora chodzący pod Windowsem, żeby można było Delphi'owską aplikację tam walnąć?

0

zobacz do dizału Artykuły gdzie A.B. wyjaśniał działanie komunikatorów

na 4programers w dziale bodajże dowlnoad są kody program - komunikator

0

Czy masz serwer do tego komunikatora chodzący pod Windowsem, żeby można było Delphi'owską aplikację tam walnąć?

Dlaczego akurat delphi'owska?

Co do twojego pytania to pobaw sie ... no nie wiem co ci napisac [glowa] pobaw sie TStringList.Objects, w stringach bedzie np numer UIN czy login, a w Object TForm. Co do wysylania to bedziesz zmuszony napisac wlasny protokol: np socket wysyla do serwera pakiet:

[code]Message;login=kowalski;msg=Czesc, co u ciebie[/code]

Jak to sparsowac dowiesz sie tutaj: http://4programmers.net/view.php?id=405

Nastepnie serwer musi przeszukac liste polaczen, liste zalogowanych etc i nastepnie wyslac w odpowiedniego socketa itd.

Ale dobrze ci radze: jesli jestes poczatkujacy nie zabieraj sie za pisanie komunikatora. Nawet jesli jakims cudem ci wyjdzie to i tak nie bedzie dostatecznie dobry, zeby powalic konkurencje.

0

Co do wysylania to bedziesz zmuszony napisac wlasny protokol: np socket wysyla do serwera pakiet:

[code]Message;login=kowalski;msg=Czesc, co u ciebie[/code]

O rany! Tacy ludzie jeszcze istnieją??? Człowieku! Chcesz wysyłaś pakiet w postaci tekstu???? Pomyśl ile SEKUND zajeło by shakowanie takiego progu... Ok możemy szyfrować :]

  1. Wydajność, wiem że to może być śmieszne ale zinterpretowanie takiego pakietu: "Message;login=kowalski;msg=Czesc, co u ciebie" wymaga troche pracy komputera choćby podzielenie go w/g ";". Nie lepiej wysyłać "typowane pakiety"??? np.
TPakiet = packed record
 Header: String;
 Msg: String;
......
end;

mam jeszcze dużo uwag ale już nie mam siły...powodzenia (no comment)

0

Tak, no comment, poczatkujacy programista pyta sie jak zrobic komunikator, wiec podaje najprostszy ze sposobow.

Z reszta i tak z zalozenia ten post mial odstraszyc, wiec nie wiem, dlaczego sie czepiasz :/

0

tzn. ehmm mam serwerka i komunikatorka(klienta), mam opracowany protokol, uzytkownik loguje sie do serwerka i zostaje zapisany pod jakims tam nadanym przez siebie loginem. W kliencie mam listboxa, uzytkownik moze dodawac innych uzytkownikow Jesli bede probowal wyslac wiadomosc do osoby, ktora nie jest zalogowana na serwerze, to zostaje ona odrzucona tak, jakby sie po prostu nic sie nie dzialo. Moim problemem jest to, w jaki sposob zrobic, aby gdy klikne na okreslona pozycje w listboxie, zostalo otwarte nowe okienko, gdzie zostalaby przypisany uzytkownik, do ktorego mozna by bylo od razu wyslac wiadomosc a dokladnij, mam zrobiona forme, jak mam zrobic aby hmm (dynamicznie?) zostal przyporzadkowany uzytkownik do wyslania, czyli po kliknieciu w listboxie i otwarla sie dana forma kilka razy ;)

ps. mam nadzieje ze nie zamieszalem :D

0

Zasmieciles.. tak dynamicznie. Zeby przypisac jakis login zrob po porstu jakas zmienna w formie. Potem tylko:

Form := TOknoRozmowy.Create;
Form.Login := ListBox.Items[ListBox.ItemIndex];

Potem bedziesz musial zablowowac podwojne wyswietlanie okna tego samego loginu...

//Marooned, powiedz to! :d

//[co] nie kumam - o co biega?? - m.M

//No wiesz, zwykle po czyms takim oznajmiasz, ze zwijales sie ze smiechu i konczysz temat jakas sensowna puentą

//Ja??? Wskaż mi proszę choć 2 takie wątki, bo coś z pamięcią u mnie cienko :| - m.M

//Eh widzialem takich mase a tera nie moge nic znalezc [glowa] ;p

//To następnym razem bez dowodów w ręku daruj sobie oszczerstwa, bo tylko sam się oczerniasz... - m.M

//To nie bylo oszczerstwo :/

0

sorki, jestem tepy, jak to zrobic?
mam cos takiego:

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
Forma.Create(Form3);
end;

co mam tu wstawic??

Mam:
Form3 - okienko z wiadomoscia
oraz
zmienna globalna: Forma

probowalem zrobic jak mowiles, ale wywala mi jakis blad a dokladniej:

"Project1.exe raised exception class EAccessViolation with message 'Acces violation at addres 0046A5BD in module 'Project1.exe'. Read of address 00000000'

jeszcze raz sorki za moje lamerstwo ;)

0

Forma.Create(Form3);

  • hmm nie wiem czy tak mozna...

ja to robilem tak:

var
  Form: TJakasForma;
begin
  Form := TJakasForma.Create;
  Form.Login := 'Cos';
  ...
end;

i najlepiej, jakbys wywalil TJakasForma z AutoCreate

0

dalem cos takiego: Forma:=TForm3.Create(Self);

teraz mi sie okienka pokazuja, ale jak je zamkne to wszystko co zostalo w nich zapisane znika, przy ponownym uruchomieniu jest pusto, da sie jakos zrobic aby forma i jej zawartosc np. tekst w memo ;) zostaly zapisane??(hehe nie ma nic nie mozliwego ;)) :)

0

czy to jest kurs pisania programów od podstaw? no litości! pomęcz się sam, więcej w ten sposób się nauczysz, co z tego, że będzie to dłużej trwało?

co do pytania - umieść formy wszystkich tworzonych okien w tablicy (albo liście), i już raz utworzonego okna nie twórz ponownie, tylko je pokazuj.

i ambitniej poproszę, bo wątek zostanie zablokowany.

0

hehe, staram sie ale chyba nici :]

zrobilem cos takiego:

procedure TForm1.ListBox1DblClick(Sender: TObject);
var 
     okienka: array of TForm3;

begin

  SetLength(okienka, 20);
  if not Assigned(okienka[0]) then
    begin
      okienka[0]:=TForm3.Create(Self);
      okienka[0].Show;
      end else okienka[0].Visible:=True;
    end;

end;

jednak nadal jesli zamkne forme, to wszystko co tam, w danej chwili bylo zapisane znika, tzn. przy ponownym uruchomieniu okienka sa komponenty np. memo ale nie ma juz na nim tekstu.

0
if okienka[0] = nil then
0
if okienka[0] = nil then

poprawilem, ale to nie rozwiazuje problemu z oknami :)

0
procedure TForm1.ListBox1DblClick(Sender: TObject);
var 
     okienka: array of TForm3;
begin
...
end;

no jakim cudem ma to działac, skoro okienka to zmienna lokalna? [glowa]
FORUM TO NIE JEST INSTRUKCJA PISANIA PROGRAMÓW! możemy pomóc rozwiązać jakiś problem, ale nie pisać razem z Tobą cały program. jeśli nie umiesz odpowiednio dobrze programować, to nie zabieraj się za pisanie tak zaawansowanych aplikacji, bo nie zrozumiesz jak działają, tylko będziesz korzystać z gotowych rozwiązań. a chyba nie o to chodzi?

matko... tyle czasu spędziłem na forum, a wciąż mam zapędy moralizatorskie. jestem nienormalny.

//ee tam... dobrze prawisz - m.M

0

i już raz utworzonego okna nie twórz ponownie, tylko je pokazuj.


procedure TForm1.ListBox1DblClick(Sender: TObject);
var 
      okienka: array of TForm3;

begin

   SetLength(okienka, 20);
   if not Assigned(okienka[0]) then
      begin
         okienka[0]:=TForm3.Create(Self);
         okienka[0].Show;
         end else okienka[0].Visible:=True;
      end;

end; 
 
  • po pierwsze a bo co te kawalek
         okienka[0]:=TForm3.Create(Self);
  • tworzysz nową f0rmę za każdym razem 2x kliknięcia - czyli usuwasz dane
  • po drugie, zamiast
         okienka[0].Show;

lepeij stosować

         okienka[0].ShowModal;

a wiec cały kodzik tak wygląda

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
Form2.ShowModal;
end;
 
0

troche sie pomeczylem, ale mysle ze udalo mi sie rozwiazac problem(przy malej pomocy z waszej strony;) )

dziekuje za pomoc :)

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