Autor Beitrag
TheKilledDeath
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: So 16.11.08 08:45 
Hallo erstmal in euerer Community
Ich entwickle seit ein paar Tagen in Delphi 2007, habe nun angefangen einen kleinen IRC Clienten mit der Indy10 IdIRC Komponente zu bauen.
Alles klappt relativ gut, ausser das vom Server gesendete Nachrichten nur bis zum vorletzten Zeichen vor einem Leerzeichen ausgegeben werden (eventuell ein 0-Bit Problem?)
Wenn nun also jemand "Hallo, wie geht es dir?" schreibt, kommt bei mir nur "Hallo" an.("," das letzte Zeichen vor dem Leerzeichen wird auch mit verschluckt!)
Ich habe bereits versucht den String in ANSIChar und danach wieder in einen Pas-String umzuwandeln, was allerdings nichts hilft
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm4.HandleMessage(ASender: TIdContext; const ANicknameFrom,
  AHost, ANicknameTo, AMessage: string);
var
  p: PAnsiChar;
  str_amessage : string;
  s_nick: string;
 // chopped_NicknameFrom : string;
  kompl_amessage: string;
  message_length: integer;
  messagearray: String;
begin
  message_length := length(Amessage) +1;
  s_nick:= copy(ANicknameFrom, 2, length(ANicknameFrom));
  p := pAnsiChar(AMessage);
  str_amessage := strpas(p);
  kompl_amessage := copy(str_amessage, 1, message_length);
  memo1.Lines.Add(s_nick+' >> '+kompl_amessage);
  //  ShowMessage(str_amessage);
  //str_amessage := strPas(PAnsiChar(AMessage));
end;

selbst mit den Kommentierten Möglichkeiten (von denen ich einige hier rausgeschnitten habe), mit denen ich meist versucht habe, den String-lenght Wert zu erhöhen, funktioniert es leider nicht.
Mit diesem Problem bin ich als relativer Delphi-Noob leiter total überfordert und würde mich sehr freuen, wenn mir geholfen werden kann. Falls jemand den kompletten Sourcecode braucht, oder die Fehler einmal selbst sehen will, kann ich ihm sowohl Sourcecode als auch die fertig kompilierte Datei einmal schicken.
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: So 16.11.08 12:13 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm4.HandleMessage(ASender: TIdContext; const ANicknameFrom,
  AHost, ANicknameTo, AMessage: string);
begin
  Memo1.Lines.Add(ANicknameFrom+' >> '+AMessage);
end;


Bei diesem Beispiel würde dir also statt
ausblenden Quelltext
1:
SenderNick >> Hallo, ich bin ein Test					

nur
ausblenden Quelltext
1:
SenderNick >> Hallo					

ausgegeben? (Lassen wir an der Stelle das Abkürzen von ANicknameFrom um drei Zeichen mal außen vor.)

mfg
TheKilledDeath Threadstarter
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: So 16.11.08 12:25 
genau. So wird es ausgegeben.
Die Nickabkürzung ist wegen den im IRC gesendeten :NICK und ist daher für das andere nicht wichtig.
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: So 16.11.08 12:49 
Passiert das denn generell bei ALLEN Nachrichten die du empfängst, oder nur bei denen die du selbst schickst? Ich hatte vor längerem mal mit irgendeiner Version der Indy das Problem, dass beim Senden der Nachrichten am Ende das EOL (#13#10) nicht richtig angehängt wurde. Allerdings war das nur ein Developement Snapshot, daher nehm ich an dass das mittlerweile gefixed ist.

Woran es jetzt aber genau hakt, kann ich dir leider auch nicht sagen.

mfg
TheKilledDeath Threadstarter
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: So 16.11.08 13:55 
die die ich selbst sende, füge ich eh mit memo1.lines.add ein, daher empfange ich sie gar nicht. Bei mir passiert das NUR bei den von den anderen gesendeten Texten.
Einloggen, um Attachments anzusehen!
IceBube
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 231



BeitragVerfasst: So 16.11.08 14:03 
Das Problem kenn ich ;)

Ich hab es so gelöst...

ausblenden Delphi-Quelltext
1:
2:
irc.Say(Channel,StringReplace(Text.Text,' ','-',[rfreplaceall])+'*');
//Die Nachricht wäre dann z.B.: Hallo,-wie-geht-es-dir?*


Beim ankommen der Nachricht, ersetzet das Programm "-" zu einen Leerzeichen. Ist natürlich nicht die beste Lösung - jedoch funktionierts.

lg

Edit:
Eine weitere Idee wäre es natürlich - dass du die Nachricht aus den Raw-Lines manuell ausliest (Weil dort steht sie glaub ich in voller Länge drinnen)..
TheKilledDeath Threadstarter
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: So 16.11.08 14:10 
Was ich mir noch denken kann, ist dass die vom IRC Server gesendete Nachricht zum Beispiel in ASCII geschrieben ist, die ASCII Leerzeichen in Pascal allerdings als StringEnde angesehen werden. Das könnte man eventuell umgehen, indem man im String alle Nullbites/Stringende durch Space ersetzt, nur wie das geht weiß ich nicht.

zu der Lösung mit den Strichen, wäre eventuell möglich, kann ich aber nicht verwenden, da ich meinen Client an andere Weitergeben will, aber auf einem offiziellen Server laufen lasse, daher den Server nicht konfigurieren kann!

Edit: Ok, ich denke ich weiß jetzt woran es liegt.
IRC sendet immer \s für SPACE und \r (afair) für neue Zeile.
vermutlich macht dieses \ ein paar Sachen kaputt... weiß jemand wie man das umgehen kann?
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mo 17.11.08 16:04 
Das ist aber nicht Standard :shock:
Leerzeichen in Nachrichten sind Leerzeichen, punkt aus. Und ein Befehl, sei es PRIVMSG oder sonst was, endet immer mit #13#10 (entspricht \r\n) als EOL. Wenn der Server sich nicht daran hält ist es kein Wunder dass die Indys damit nicht zurechtkommen, immerhin ist im Protokol nichts dergleichen vorgesehen!

mfg


Zuletzt bearbeitet von LexXis am Mo 17.11.08 18:39, insgesamt 1-mal bearbeitet
TheKilledDeath Threadstarter
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: Mo 17.11.08 18:32 
ich habe es jetzt einmal mit RAW versucht, klappt auch super (eventuell war es ja doch nicht /s und /r), allerdings weiß ich nicht, wie ich da die nicks rausbekomme!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm4.IdIRC1Raw(ASender:TIdContext; AIn: Boolean; AMessage: string);
var
text:string;
empf:string;
zwisch:string;
pmessage:string;
begin
    //memo1.Lines.Add(ASender); //<<klappt nicht, da kein string!
    zwisch := copy(AMessage, pos('#', AMessage),length(AMessage));
    delete(zwisch, pos(' ', zwisch), length(zwisch));
    empf := copy(Amessage, pos(' ', Amessage)+1, length(Amessage));
    delete(empf, pos(' ',empf),length(empf));
    text := copy(AMessage, pos(':', AMessage)+1, length(AMessage));
    if zwisch = '#unrealsoftware.de' then
    begin
    memo1.Lines.Add(' >> '+text);
    end;
    if empf = 'TheKilledClient' then
    begin
      if text = 'Unknown command' then
        else
        memo1.Lines.Add(' PM>> ' +text);
    end;
 // end
end;


Allerdings kann man ASender nicht ausgeben (da kein string), in der Message selbst steht aber nur PRIVMSG #CHANNEL TEXT drin. Das bringt mir aber leider nicht viel, ich kann ja keinen chat bauen, in dem man nicht sieht, wer was geschrieben hat =)

Edit: ich will ja nicht unhöflich sein, aber es heißt standard =)
TheKilledDeath Threadstarter
Hält's aus hier
Beiträge: 6

Win XP, Ubuntu 8.10, SuSe Linux, ReactOS
Delphi 2007
BeitragVerfasst: Do 20.11.08 19:05 
ich push das mal...
also mein problem ist derzeit, dass ich eben aus jenem TidContext keinen String herausholen kann, in dem TidContext namens ASender aber vermutlich der Nickname des Senders ist.