![]() |
TFIleStream und Pointer
Hallöchen,
ich hab ein kleines Problemchen mit der TICQ Komponente. Beim empfangen von Dateien gibts da ne Procedure die sieht so aus :
Delphi-Quellcode:
Wie speichere ich denn da die Daten ?
procedure TMainForm.ICQFTFileData(Sender: TObject; UIN: Cardinal;
Data: Pointer; DataLen: Cardinal; LastPacket: Boolean); begin end; Matthias |
Re: TFIleStream und Pointer
Du nimmst dir einen Filestream und dereferenzierst Data:
Delphi-Quellcode:
BtW: Ist nur eine Idee, musst es wohl noch ausbauen.
fs := TFileStream.Create(DateiName, fmCreate); // Sollte global ausgeführt werden
procedure OnReceive({...}); begin fs.Write(Data^, DataLen); if LastPacket then fs.Destroy; end; |
Re: TFIleStream und Pointer
Delphi-Quellcode:
procedure TMainForm.ICQFTFileData(Sender: TObject; UIN: Cardinal; Data: Pointer; DataLen: Cardinal; LastPacket: Boolean);
var LStream: TFileStream; begin LStream := TFileStream.Create('e:\text.txt', fmCreate); LStream.Write(Data^, DataLen); LStream.Free; |
Re: TFIleStream und Pointer
Hallöhen,
danke Euch erst mal für die Antworten ! Ich hab es jetzt so versucht, bekomme aber imme rnen schwersten Fehler, der nichtmal abzufangen geht.
Delphi-Quellcode:
Also da kommt ein Fehler mit so ner Art Compilerfenster.
(( Global ))
var SendStream: TFileStream; RecvStream: TFileStream; // Aufruf wenn jemand eine Datei senden will ( geht ) procedure TMainForm.ICQFTRequest(Sender: TObject; RequestRec: TFTRequestRec); begin if MessageDlg(IntToStr(RequestRec.UIN)+' Möchte Ihnen eine Datei senden. Annehmen ?', mtConfirmation , [mbOK, mbCancel], 0)= mrOK then begin Mess('Angenommen'); ICQ.FTResponse(RequestRec, True, ''); RecvStream:= TFileStream.Create(ExtractFilePath(ParamStr(0))+RequestRec.FileName, fmCreate); end else begin ICQ.FTResponse(RequestRec, False, ''); Mess('Dateiempfang Angebrochen'); end; end; // hier ist das Problem procedure TMainForm.ICQFTFileData(Sender: TObject; UIN: Cardinal; Data: Pointer; DataLen: Cardinal; LastPacket: Boolean); begin if not LastPacket then begin try RecvStream.Write(Data^, DataLen); RecvStream.Seek(0,soFromEnd); Mess('write'); except Mess('kann not Write'); end; end else begin Mess('File End'); RecvStream.Destroy; end; end; Hmm, keine Anhnung warum das nicht geht ? Matthias |
Re: TFIleStream und Pointer
Und was steht in der Fehlermeldung drin :wall:
|
Re: TFIleStream und Pointer
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöchen,
also da kommt das grosse fenster blos, keine richtige Fehlermeldung, das is ja das blöde. Ich hab aber mal ein bidchend davon gemacht und hier angehangen. Glaub aber nicht das das wirklich hilft :-( Matthias |
Re: TFIleStream und Pointer
Delphi-Quellcode:
// hier ist das Problem
procedure TMainForm.ICQFTFileData(Sender: TObject; UIN: Cardinal; Data: Pointer; DataLen: Cardinal; LastPacket: Boolean); begin If ( Assigned(RecvStream) ) Then Begin RecvStream.Write(Data^, DataLen); If ( LastPacket ) Then FreeAndNil(RecvStream); End; end; |
Re: TFIleStream und Pointer
Hallöchen,
dank Euch schon wieder für die Antwort, leider geht es auch wiede rnicht. Kommt wieder deas gleiche. Wieder so ein Fensterchen mit irgendwelchen Zahlen. Ich hab das ganze was zu dem File Senden gehört mal zusammengefasst und in ein kleines Projekt gemacht. Hier der Code...ist vielleicht für Euch ein bischen besser wegen der Übersichtlichkeit. Ich weiss nicht mehr was ich noch probieren soll. Falls jemand von Euch die ICQ Kompomente hat könntet Ihr das ja mal ausprobieren.
Delphi-Quellcode:
Ich dank Euch ganz doll !!
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ICQClient, ICQWorks, ExtCtrls; type TForm1 = class(TForm) ICQClient1: TICQClient; Label1: TLabel; OpenDialog1: TOpenDialog; Button1: TButton; edFile: TLabeledEdit; btnLogIn: TButton; edOnline: TEdit; procedure Button1Click(Sender: TObject); procedure btnLogInClick(Sender: TObject); procedure ICQClient1Login(Sender: TObject); procedure ICQClient1SendFileStart(Sender: TObject; UIN: Cardinal; SendFileRec: TSendFileRec); procedure ICQClient1SendFileData(Sender: TObject; UIN: Cardinal; Data: Pointer; var DataLen: Cardinal; var IsLastPacket: Boolean); procedure ICQClient1OnlineInfo(Sender: TObject; UIN: String; Port: Word; InternalIP, ExternalIP: String; OnlineTime: TDateTime; Idle: Word; ICQVersion, MirandaVersion: Cardinal; ProtoVer, UserCaps: Byte); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; SendStream: TFileStream; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var FileName: string; begin if OpenDialog1.Execute then begin FileName:=OpenDialog1.FileName; edFile.Text:=OpenDialog1.FileName; ICQClient1.SendFileDC(95369854, FileName, 'Testing SendFileDC'); End; end; procedure TForm1.btnLogInClick(Sender: TObject); begin ICQClient1.Login; ICQClient1.AddContactVisible(95369854); end; procedure TForm1.ICQClient1Login(Sender: TObject); begin Label1.Caption:=StatusToStr(ICQClient1.Status); end; procedure TForm1.ICQClient1SendFileStart(Sender: TObject; UIN: Cardinal; SendFileRec: TSendFileRec); Begin If SendStream <> nil then FreeAndNil(SendStream); // can only proccess one send at a time with this code. // Open File For Reading. SendStream := TFileStream.Create(SendFileRec.FilePath + SendFileRec.FileName, fmOpenRead); End; procedure TForm1.ICQClient1SendFileData(Sender: TObject; UIN: Cardinal; Data: Pointer; var DataLen: Cardinal; var IsLastPacket: Boolean); begin // Read 2048 bytes into Data Buffer. DataLen := SendStream.Read(Data, 2048); // Are we at the end of the file? IsLastPacket := SendStream.Position = SendStream.Size; end; Matthias |
Re: TFIleStream und Pointer
Moin!
Data wird beim senden angegeben aber nirgendwo alloziiert - daher die Frage: Ist Data bei der letzten Ereignisprocedure schon alloziiert und wenn wann ja, mit wieviel Bytes? Und wenn nicht, wieso wird nicht alloziiert? Und warum auf einmal das senden von Dateien - letztens war es noch das empfangen von Dateien? MfG Muetze1 |
Re: TFIleStream und Pointer
Hallöchen,
ich hab das so wie das ist aus dem Beispiel übernommen. Deswegen auch die Englischen kommentare. Data ist wohl in der ICQWorks assoziiert denke ich mal. Weiss ichaber wirklich nicht genau. Wie gesagt ich bin nur erst mal am probieren. Zum Senden... deswegen weil ich das empfangen nicht so einfach ausprobieren kann, da bei mir immer nichts eingeht. Ich hab jetzt hie nen Kumpel an der STrippe mit dem ich immer mal probieren kann. Wenn ich sende dann kommt bei Ihm wenigstens was an. Wenn er sendet kommt erst mal gar nix an. Falls das an Data liegen sollte ... wie sol ich das Assoziieren ? MAtthias |
Re: TFIleStream und Pointer
Hallöchen,
jetzt hab ich glaube ich den Fehler gefunden, so gehts erst mal überhaupt :
Delphi-Quellcode:
Das Problem war anscheinend die Zeile hier :
procedure TForm1.ICQClient1SendFileData(Sender: TObject; UIN: Cardinal;
Data: Pointer; var DataLen: Cardinal; var IsLastPacket: Boolean); begin DataLen := SendStream.Read(Data^, 256); edDataLen.Text:=IntToStr(DataLen); ssPos.Text:=IntToStr(SendStream.Position); ssSize.Text:=IntToStr(SendStream.Size); //if SendStream.Position = SendStream.Size then if DataLen < 256 then IsLastPacket := True; end;
Delphi-Quellcode:
Das musste auch ein Pointer auf die Daten sein.
DataLen := SendStream.Read(Data^, 256);
Das Problem ist jetzt nur noch das er aufhört zu senden bevor alle daten übertragen sind. Das Problem ist nur das hier :
Delphi-Quellcode:
Irgendwie scheint das nicht hinzuhauen.
IsLastPacket := SendStream.Position = SendStream.Size;
Ich hab jetzt zum testen mal 3 Edits gemacht in denen die DataLen, SendStream.Position und SendStream.Size angezeigt werden. Es passiert folgendes : SendStream.Size zeigt die richtige grösse an, SendStream.Position steigt an bis SendStream.Size erreicht ist und DataLen zeigt die aktuelle grösse der Daten an die gesendet werden. Scheint also alle zu stimmn. Trotzdem kmmt nur die hälfte an.??? Beim kupel sagt ICQ dann immer 'Othr Side has closed the Connection' ... Hmm, an was könnte das denn jetzt noch liegen ? Matias |
Re: TFIleStream und Pointer
Hallöchen nochmal,
ich bekomms einfach nicht gebacken. Das senden geht nun manchmal, manchmal nicht. Das empfangen geht gar nicht. Vielleicht habt ihr ja Lust das Teil mal zu testen. So viel Erfahrung hab ich ja noch nicht. Vielleicht bekommt Ihr es ja hin. Falls also jemand Lust haben sollte hab ich ![]() Ich danke Euch Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz