Autor |
Beitrag |
bLuTm8
Hält's aus hier
Beiträge: 3
Linux, Linux, Linux, WIN 4.0, WIN 5.1
D6/7, K2
|
Verfasst: Mi 16.02.05 21:21
hallo delphi freunde
viele von euch kennen bestimmt das phänomen, wenn man wochenlang an einem programm codet,
das man nach einiger zeit den blick für das wesentliche/naheliegende aus den augen verliert
und um letztlich den code irgendwie lauffähig zu bekommen dann recht "umständliche" routinen
baut.
ich sitze zur zeit an einem chatclienten, der soweit hervorragend arbeitet. allerdings ist
der smilie-parser-code der vom chatserver empfangenen nachrichten etwas "unglücklich"
(viel zuviele if-verzweigungen)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function IsSmilie2(code: ShortString): Byte; begin code := UpperCase(code); if code = ':)' then result := 1 else if code = ':(' then result := 2 else if code = ';)' then result := 3 ... else if code = 'X(' then result := 14 else if code = '=;' then result := 27 else result := 0; end;
function IsSmilie3(code: ShortString): Byte; begin code := UpperCase(code); if code = ';;)' then result := 5 else if code = ':-/' then result := 7 else if code = ':">' then result := 9 ... else result := 0; end; |
'IsSmilie4' ist identisch (halt für 4bytes)
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TChatForm.Display_Message(Nick, Msg: string; NickStyle, MsgStyle: Byte); var i: Integer; idx: byte; sLeft: string; begin RVChat.AddFromNewLine(Nick+#32, NickStyle); Msg := Trim(Msg); sLeft := ''; i := 1; while i < Length(Msg) do begin if IsSmilie4(copy(Msg,i,4)) <> 0 then begin idx := IsSmilie4(copy(Msg,i,4)); RvChat.Add(copy(sleft,1,length(sLeft)-1), MsgStyle); sLeft := ''; RVChat.AddBullet(idx-1, SmilieImageList, false); inc(i,4); if Trim(copy(Msg,i,Length(Msg))) = '' then Break; end else if IsSmilie3(copy(Msg,i,3)) <> 0 then begin idx := IsSmilie3(copy(Msg,i,3)); RvChat.Add(copy(sleft,1,length(sLeft)-1), MsgStyle); sLeft := ''; RVChat.AddBullet(idx-1, SmilieImageList, false); inc(i,3); if Trim(copy(Msg,i,Length(Msg))) = '' then Break; end else if IsSmilie2(copy(Msg,i,2)) <> 0 then begin idx := IsSmilie2(copy(Msg,i,2)); RvChat.Add(copy(sleft,1,length(sLeft)-1), MsgStyle); sLeft := ''; RVChat.AddBullet(idx-1, SmilieImageList, false); inc(i,2); if Trim(copy(Msg,i,Length(Msg))) = '' then Break; end else begin sLeft := sLeft + copy(Msg,i,1); inc(i); end; end; RVChat.Add(sleft+copy(Msg,i,1), MsgStyle); RVChat.FormatTail; RVChat.Refresh; end; |
TRVChatForm ist eine auf TRichView basierende komponente, die wiederum auf
richedit (ohne editierfunktion) basiert.
Ich würde mich über ein paar anregungen freuen
grüssle bluti
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.Moderiert von Tino: Topic aus Sonstiges verschoben am Mo 21.02.2005 um 13:26
|
|
I.MacLeod
Beiträge: 109
|
Verfasst: Mi 16.02.05 21:46
Eine einfache Lösung:
erstell eine TStringList mit dem Inhalt:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| :) :( ;) ... ;;) ... :-/ ... :"> ... ... |
Und dann holst du dir den Index mit StringList.IndexOf(code). Wenn das Ergebnis -1 ist ists kein Smiley.
_________________ {$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
|
|
bLuTm8
Hält's aus hier
Beiträge: 3
Linux, Linux, Linux, WIN 4.0, WIN 5.1
D6/7, K2
|
Verfasst: Mi 16.02.05 22:05
danke dir,
das war auch mein erster ansatz (zwar keine stringliste, sondern ein array aus konstanten), aber egal ob statisch oder dynamisch,
die sache hat einen haken:
einige smilies haben ähnliche codes (zb: ": )" und ": ) )"), so das ich auch hier wieder eine fallentscheidung anhand der länge des codes treffen muss (welchen der beiden indexe liefert mir delphi beim stringsuchen ": )" in obigem beispiel ?) ...
ok, gehen wir davon aus, das ich drei arrays bzw tstrings erstelle.
dann tut sich das nächste problem auf: die indexe der listen/arrays sind nicht mehr mit denen in der imagelist "kompatibel", so das erneut zusatzcode anfällt.
... ziemlich verzwickt, diese ansich eigentliche einfache aufgabe
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 16.02.05 22:57
IndexOf sucht immer nach exakten Übereinstimmungen.
BtwBTW: Wenn du mehrere Smileys hast, die den gleichen Code zurückliefern sollen, kannst Du Byte für Byte als HEX-Zahl kodieren (aus "." wird dann "2E" und sowas) dann kannst Du mit Result := IntToStrDef(SL.Values[HexSmileyName], -1); deinen Smiley in einen Index übersetzen, wenn deine Liste z.B. so hier aussieht:
Quelltext
(2E=.; 2F=
Für mehrbyte-Smileys einfach die Bytes hintereinanderfügen.
2F2E --> :.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
bLuTm8
Hält's aus hier
Beiträge: 3
Linux, Linux, Linux, WIN 4.0, WIN 5.1
D6/7, K2
|
Verfasst: So 20.02.05 01:33
vielen dank
das war genau die richtung bzw eingebung, die mir partout nicht kommen wollte....
ich experimentiere damit momentan ein wenig rum und hab auch noch ein paar andere projekte parallel,
sodass ich erst jetzt zeit zum antworten fand
|
|
|