Witam.
Tworzę komunikator internetowy i chcę oprzeć listę kontaktów o komponent Webbrowser ze względu na większe możliwości niż np. Listbox (i pochodne). Kilka dni szukałem informacji jak można to zrealizować w Delphi w miarę optymalnie. Na początku wzorowałem się na komunikatorze AQQ, ponieważ całe okno główne ( i rozmowy) jest oparte o kod html/css któremu mogę się przyjrzeć.
Udało mi się w miarę sprawnie odizolować samą listę kontaktów i stworzyć na tej podstawie własną, by móc wyświetlić to w WebBrowser. W AQQ lista kontaktów składa się z kilku głównych plików (Body.htm -> całe ciało okna głównego zawierającego listę kontaktów, Item.htm -> zawiera zwykłą tabelę z itemem nie zaznaczonym, Selected.htm, to samo co item.htm, tylko że kontakt jest zaznaczony)
Dla testów stworzyłem sobie plik Body.htm z powieloną zawartością Item.htm i Selected.htm by zobaczyć jak to wygląda w Webbrowser. Wszystko chodzi ładnie pięknie, ale pojawiają się problemy:
Problemy:
a) Jak pobrać nazwę kontaktu po kliku/dwukliku na dany numer?
b) Jak zaznaczać dany kontakt? (czyli zamiast item.htm wyświetlić selected.htm)
c) Jak dodać/usuwać kontakty
Możliwe rozwiązania:
odnośnie a)
Nagłówek tabeli np. z pliku Item.htm wygląda tak:
<table onmousedown="window.status='_EDTR_ITEM_NORMAL_'" class="finito_out" cellpadding="0" cellspacing="0" onmousemove="window.status='CC_OVERITEM'" onmouseover="this.className='finito_in'" onmouseout="this.className='finito_out'; window.status='CC_NONE';" ondblclick="window.status='CC_EXECUTE'" onClick="window.status='CC_SELECTED'">
.....
Tutaj ciało itema
....
</table>
na razie wykrywam stan itemu przez zdarzenie:
procedure TForm1.WebBrowser1StatusTextChange(ASender: TObject;
const Text: WideString);
dzięki temu mogę wykryć, czy kliknięto raz: onClick="window.status='CC_SELECTED' , czy dwa : ondblclick="window.status='CC_EXECUTE', ponieważ zmienna Text zwraca mi wartości jakie siedzą w window.status, ale jak wykryć, na jaki item kliknięto i jak pobrać nazwę użytkownika?
if Text='CC_EXECUTE' then
ShowMessage('Execute');
Myślałem, żeby zastosować funkcję Pos, która by szukała w zmiennej Text wystąpienia słowa np. _EXECUTE a zamiast CC trzymać numer kontaktu (123456_EXECUTE, zmieniać wartość CC_EXECUTE za pomocą StringReplace, przy dodawaniu itemów do listy) ale czy istnieje jakieś bardziej optymalne rozwiązanie? Ma ktoś lepszy pomysł?
odnośnie b)
nazwę kontaktu w pliku item.htm trzymam tak:
<span class="buddy">CAPTION</span>
Tu zaczynają się schody, prostackim rozwiązaniem byłoby robić to za pomocą StringReplace, wyszukiwać w Body.htm zawartość pliku item.htm, pobrać caption kontaktu w sposób np. z punktu a)
i zamienić StringReplacem występowanie tabelki z item.htm i odpowiednią nazwą na zawartość pliku selected.htm(Przy zmianie trzeba zmieniać CAPTION z pliku selected.htm na caption pobrany z punktu a) ) i odświeżenie WebBrowsera.
Odnośnie c)
Nie wiem jak jest to zrobione w AQQ, ale ja mam plan taki, by trzymać listę kontaktów np w tablicy rekordów, przyjmijmy:
type
TUsers=record
Nazwa:String;
Numer:Integer;
Selected:Boolean;
HTML:String; //tu trzymałbym zawartość pliku item.htm (wiem, strasznie pamięciożerne)
end;
Items:Array of TUsers;
Następnie pętlą dodawałbym do pliku Body.htm zawartość items[i].HTML, a do tablicy dodawał/usuwał usera
Pytanie:
Powiem szczerze, że moje zaproponowane możliwości nie są zbyt dobrym rozwiązaniem, pewnie strasznie by obciążały komputer i jadły pamieć. Zwracam się do Was, może ktoś miał podobny problem, albo ma jakiś pomysł jakbym mógł to lepiej zrobić. Nie chodzi mi już nawet o te pliki Body.htm itd. ale ogółem jak zrealizować taką listę kontaktów w CSS/HTML na kontrolce Webbrowser z zaznaczaniem/dodawaniem/usuwaniem/pobieraniem informacji z danych itemów.
Proszę o jakieś pomysły.
Zależy mi na optymalnym i dość szybko działającym rozwiązaniu. Z tego co zauważyłem, to AQQ wczytuje wszystkie pliki html przy starcie do pamięci i na tym operuje, ponieważ podczas pracy programu gdy zmienie zawartość plików html, to AQQ reaguje dopiero po zmianie skina/restarcie
Pozdrawiam.
p.s Oczywiście pliki od AQQ wziąłem tylko dla testów i żeby się czegoś nauczyć, nie zamierzam ich wykorzystać w żadnym wypadku w swoim programie, jedynie chcę zaczerpnąć pomysł i przy tworzeniu własnego kodu html/css móc się na czymś wzorować.