Entwickler-Ecke

Dateizugriff - Inhalt von .dat Datei in TListbox anzeigen und verändern


Serpentine - Fr 03.10.08 23:20
Titel: Inhalt von .dat Datei in TListbox anzeigen und verändern
Hiho ich habe da eine Datei, die eine Liste von Nicknamen enthält, diese möchte ich mir ein einem Programm per TListbox anzeigen lassen, allerdings ist mir das Format der Datei unbekannt und ich weiß nicht genau wie ich dies anstellen soll. Im Netz habe ich einen Sourcecode in AutoIt gefunden, genau für diese Datei der dieses macht, allerdings kann ich ihn nicht in Delphi übersetzen =/ es wäre nett wenn jemand dies machen könnte, bei der wirte und read Prozedur, oder eine eigene schreibt! Hier der Code, die Datei werde ich anhängen:


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:
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:
54:
55:
56:
57:
58:
59:
60:
#include <GUIConstantsEx.au3>
#Include <String.au3>
#Include <Array.au3>

GUICreate("Blocks", 300, 200)
$list = GUICtrlCreateList("", 10, 10, 130, 180)
$add = GUICtrlCreateButton("Add", 150, 10, 40)
$input = GUICtrlCreateInput("NewBlock", 200, 11, 85, 23)
$delete = GUICtrlCreateButton("Delete from List", 150, 50, 136)
$save = GUICtrlCreateButton("Save", 150, 160, 136)
GUISetState()
read()
Do   
$msg = GUIGetMsg()
   If $msg = $add Then
      $new = GUICtrlRead($input)
      _ArrayAdd($block, $new)
      GUICtrlSetData($list, "")
      For $i=1 To UBound($block)-1
         GUICtrlSetData($list, $block[$i])
      Next
   EndIf
   If $msg = $delete Then
      $selected = GUICtrlRead($list)
      $number = _ArraySearch($block, $selected, 0, 0, 0, 1)
      _ArrayDelete($block, $number)
      GUICtrlSetData($list, "")
      For $i=1 To UBound($block)-1
         GUICtrlSetData($list, $block[$i])
      Next
   EndIf
   If $msg = $save Then
      write()
   EndIf
Until $msg = $GUI_EVENT_CLOSE

Func read()
$file = FileOpen(@ScriptDir&"\Setting\SRChattingBlockingList.dat", 4)
$start = FileRead($file, 4)
$number = Dec(StringTrimLeft(String(FileRead($file, 1)), 2))
$shit = FileRead($file, 3)
Global $block[$number+1]
For $i=1 To $number
   $chars = Dec(StringTrimLeft(String(FileRead($file, 1)), 2))
   $block[$i] = _HexToString(StringTrimLeft(String(FileRead($file, $chars)), 2))
   GUICtrlSetData($list, $block[$i])
Next
FileClose($file)
EndFunc

Func write()
$file = FileOpen(@ScriptDir&"\Setting\SRChattingBlockingList.dat", 18)
FileWrite($file, 0x1)
FileWrite($file, UBound($block)-1)
For $i=1 To UBound($block)-1
   FileWrite($file, BinaryMid("0x"&Hex(StringLen($block[$i])),4,4))
   FileWrite($file, $block[$i])
Next
FileClose($file)
EndFunc


Danke :)


Yogu - Fr 03.10.08 23:59


Inhalt der Datei:
1:
.........VOP.VOPP.Liingling.Venusxiaomei.diemkbn.snow_snuck.twetery.lllIIIII.farkiewe.He_Mat.bobo003.Veleni.wowowow.MISSCUI.uawoijasojfo.sgfwrt.loveuloveu.YVY444.Venusyun.dfdfwad                    

(Die Punkte stellen nicht darstellbare Zeichen dar)

Kann man davon ausgehen, dass die Datei immer mit ".........VOP.VOPP." anfängt, und anschließend die Namen aufgelistet sind, mit einem nicht darstellbaren Zeichen als Trennzeichen? Dann könntest du das so machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var S: String;
begin
  S := ListBox1.Items.Text;
  Delete(S, 118);
  ListBox1.Items.Delimiter := #0;
  ListBox1.Items.DelimitedText := S;
end;

Eine kleine Hürde ist die, dass das Trennzeichen nicht immer gleich ist. Du könntest es aber mal so probieren. Bei mir klappt das ganze, wenn ich die Datei über den Windows Editor lade, und in Delphi einfüge.


Serpentine - Sa 04.10.08 01:05

Ne VOP und VOPP sind auch Nicknames die dazu gehören, aber dann kann ich das ganze ja so ändern:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var S: String;
begin
  S := ListBox1.Items.Text;
  Delete(S, 110);
  ListBox1.Items.Delimiter := #0;
  ListBox1.Items.DelimitedText := S;
end;


und zum verändern der Einträge/löschen/hinzufügen, wie soll die Prozdur aussehen?

ich habe jetzt mal folgende Prozedur zum lesen verwendet erhalte allerdings einen Fehler:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var S: String;
f:textfile;
begin
  assignfile(f,'G:\Spiele\Silkroad\Setting\SRChattingBlockingList.dat');
  Read(f,S);
  S := ListBox1.Items.Text;
  Delete(S, 110);
  ListBox1.Items.Delimiter := #0;
  ListBox1.Items.DelimitedText := S;
end;


Warum verstehe ich nicht^^


Yogu - Sa 04.10.08 12:49

user profile iconSerpentine hat folgendes geschrieben Zum zitierten Posting springen:
Ne VOP und VOPP sind auch Nicknames die dazu gehören, aber dann kann ich das ganze ja so ändern:

Klar, das geht dann auch.

user profile iconSerpentine hat folgendes geschrieben Zum zitierten Posting springen:
und zum verändern der Einträge/löschen/hinzufügen, wie soll die Prozdur aussehen?

Da ich nicht dahinterstehe, wie die verschiedenen Trennzeichen zu Stande kommen, kann ich dir in diesem Fall leider nicht weiterhelfen. :|

user profile iconSerpentine hat folgendes geschrieben Zum zitierten Posting springen:
ich habe jetzt mal folgende Prozedur zum lesen verwendet erhalte allerdings einen Fehler:

Da haben sich zwei kleine Fehler eingeschlichen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
var S: String;
f:textfile;
begin
  assignfile(f,'G:\Spiele\Silkroad\Setting\SRChattingBlockingList.dat');

  // Bevor du die Datei auch verwenden kannst, musst du sie öffnen
  // (AssignFile weist nur den Dateinamen zu)
  reset(f);

  Read(f,S);

  // Die folgende Zeile solltest du entfernen, da in S ja schon der Dateiinhalt steht.
  // S := ListBox1.Items.Text;

  Delete(S, 110);
  ListBox1.Items.Delimiter := #0;
  ListBox1.Items.DelimitedText := S;
end;


Serpentine - Sa 04.10.08 13:43

Dummer Fehler^^ ist mir auch schon aufgefallen *kopf->tisch* aber danke für deine Hilfe!
Anhand des AutoIt Quelltextes müsste sich doch die Funktionsweise der Trennzeichen zu erkennen seien, kann diesen nicht jemand in Delphi übersetzen, habe das selber schon ein wenig versucht komme mit AutoIt aber garnicht zurecht.

Wozu ich das ganze benutzen will ist, dass ich eine Liste in Form einer *.txt auf meienm Server habe, in die ich immer eine Liste von Spambots eintrage, und dafür will ich dann einen Client schreiben, der diese Liste in die vorliegende .dat überträgt. Das klappt auch alles soweit, nur soll er eine komplett neue .dat erstellen und die alte dadurch ersetzen, und an dem Format der .dat und den Trennzeichen hakt es dann jetzt noch.


freak4fun - So 05.10.08 18:39

Crosspost [http://www.delphipraxis.net/topic143630_dat+datei+in+tlistbox+anzeigen+und+eintraege+veraendern.html]