Codeconvertierung ICQClient-Komponente Delphi -> CB6
-
Hallo! Ich habe mir die Komponente ICQClient (für Delphi 5+) heruntergeladen und versuche diese nun mit dem CB6 zu verwenden. Der Login zum ICQ-Server, das senden von Nachrichten und sonstige Funktionen gehen einwendfrei. Nur mit dem Anfordern der Kontaktliste vom ICQ-Server habe ich einige Probleme.
In der Hilfe der Komponente ist es so beschrieben:
OnServerListRecv(Sender: TObject; SrvContactList: TList) A response to RequestContactList procedure. After using the SrvContactList you *must* call DestroyUINList procedure with SrvContactList as a parameter, required to free allocated data, otherwise you'll have memory leaks. Each SrvContactList is a pointer on a TUINEntry stucture (declared in ICQClient.pas). TUINEntry = record UIN: LongWord; //UIN in contact list Nick: ShortString; //Nick of this UIN, can be null(empty) CType: Word; //Type, can be U_NORMAL(Normal contact list entry), U_VISIBLE_LIST(user is in visible list) //, U_INVISIBLE_LIST(user is in invisible list), U_IGNORE_LIST(user is in ignore list) CGroupID: Word; //Group's ID user belongs to CTag: Word; //ID of the user CGroup: ShortString; //Group name, UIN belongs to end; Example: procedure TMainForm.ICQClient1ServerListRecv(Sender: TObject; SrvContactList: TList); var i: Word; UserInfo: TUINEntry; begin if SrvContactList.Count > 0 then for i := 0 to SrvContactList.Count - 1 do begin UserInfo := PUINEntry(SrvContactList.Items[i])^; Memo1.Lines.Add(UserInfo.Nick + ' is in group ' + UserInfo.CGroup + ' and his uin is ' + IntToStr(UserInfo.UIN)); end; ICQClient1.DestroyUINList(SrvContactList); end;Ich habe das jetzt mal versuch in CB6 zu übersetzen.
void __fastcall TForm1::icqServerListRecv(TObject *Sender, TList *SrvContactList) { Memo1->Lines->Add("Kontaktliste anfordern..."); TUINEntry test; LongWord UIN; }Weiter bin ich leider noch nicht gekommen

Außedem kann ich der Komponente nicht die UIN zuweisen:
[C++ Error] Unit1.cpp(38): E2015 Ambiguity between '_fastcall Sysutils::StrToInt(const System::AnsiString)' and '_fastcall Icqworks::StrToInt(const System::AnsiString)'Gibt es hier vielleicht Jemanden, der mir helfen kann? Wäre echt super!! Danke!!!
-
Also "Count" der Kontaktliste kann ich abfragen aber wie die Einträge??
ListBox1->Items->Add(SrvContactList->Count);Raus kommt "17"
ListBox1->Items->Add(SrvContactList->Items[0]);da meint er:
[C++ Error] Unit1.cpp(36): E2034 Cannot convert 'void *' to 'AnsiString'
-
Warum willst du es auch in AnsiString konvertieren? Glaubst du nicht, dass du da nen zwischenschritt vergessen hast?
-
UserInfo := PUINEntry(SrvContactList.Items[i])^;Hier geht es ja auch, nur weiß ich nicht wie ich
UserInfo := PUINEntryauf den Builder übertragen kann.
-
Auf diese Idee
UserInfo = PUINEntry(SrvContactList.Items[i]);bist du wahrscheinlich schon selbst gekommen... was kommt denn da für ne Meldung?
-
Da kommt
E2451 Undefined symbol 'UserInfo' E2294 Structure required on left side of . or .*Das heißt ich muss "UserInfo" deklarieren aber wie??
Vielleicht mit
PUINEntry UserInfo;das funktioniert, aber wie dann weiter?
-
Na wohl eher
TUINEntryUnd dann halt
UserInfo = PUINEntry(SrvContactList->Items[i]);Schon ein wenig scheiße, dass du der einzige bist, der das teste kann...

-
Das geht leider auch nicht!
Scheiss Delphi ^^
Hier der Link zur Komponente: (ist ganz einfach zu bedienen nur halt dieses dumme anfordern der ContactList)

http://prdownloads.sourceforge.net/ticqlib/icq_20040630.zip?download
-
Wenn ichs so mache kommt nur noch der Fehler:
TUINEntry UserInfo = PUINEntry(SrvContactList->Items[0]);E2034 Cannot convert 'TUINEntry *' to 'TUINEntry'Also ihrgendwie muss das schon stimmen hmm...
-
TUINEntry UserInfo; UserInfo = PUINEntry (SrvContactList->Items[0]);so gehts auch net und andersrum auch net... verstehe das nicht kennt sich denn hier keine mit Delphi aus?
-
Nun, das hat nicht unbedingt was mit delphi zu tun. Der dämliche Programmierstil ist halt ... dämlich.
TUINEntry *UserInfo;Probier mal.
-
DANKSCHÖN!! DU BIST DER KING ^^
FUNKTIONIERT EINWANDFREI
:TUINEntry *UserInfo; int clcount = SrvContactList->Count; int i = 0; while (i < clcount) { UserInfo = PUINEntry (SrvContactList->Items[i]); ListBox1->Items->Add(UserInfo->Nick); i++; }Aber ich kann immernoch nicht
StrToIntverwenden

-
Der Compiler findet zwei Versionen von StrToInt und weiß nicht welche er verwenden soll. Du mußt den Namespace vor die Funktion stellen. z.B. Systutils::StrToInt(...).
-
Ah ja genau danke!!! Wusste das es zwei funktionen gab aber wie ich das lösen kann "wusste" ich nicht! DANKE! ^^
-
Was denn, ich bin kein King?? Den Unterschied zwischen Objekt und Zeiger hätte ich auch gewußt... grummel

-
Doch, du auch
!
Ja aber das ist so dumm gemacht finde ich... außerdem in Delphi ^^
-
wäre es denn nicht einfacher die kompo direkt so zu verwenden, anstatt sie erst umständlich in den bcb zu konvertieren?