AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFIleStream und Pointer

Ein Thema von goose33 · begonnen am 4. Nov 2004 · letzter Beitrag vom 6. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#1

TFIleStream und Pointer

  Alt 4. Nov 2004, 06:20
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:
procedure TMainForm.ICQFTFileData(Sender: TObject; UIN: Cardinal;
  Data: Pointer; DataLen: Cardinal; LastPacket: Boolean);
begin

end;
Wie speichere ich denn da die Daten ?


Matthias
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 06:24
Du nimmst dir einen Filestream und dereferenzierst Data:
Delphi-Quellcode:
fs := TFileStream.Create(DateiName, fmCreate); // Sollte global ausgeführt werden

procedure OnReceive({...});
begin
  fs.Write(Data^, DataLen);
  if LastPacket then
    fs.Destroy;
end;
BtW: Ist nur eine Idee, musst es wohl noch ausbauen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 06:26
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#4

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 09:24
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:
(( 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;
Also da kommt ein Fehler mit so ner Art Compilerfenster.

Hmm, keine Anhnung warum das nicht geht ?

Matthias
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#5

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 12:01
Und was steht in der Fehlermeldung drin
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#6

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 12:35
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
Miniaturansicht angehängter Grafiken
eddor_2.jpg   error_1.jpg  
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 14:46
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;
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#8

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 18:56
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:
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;
Ich dank Euch ganz doll !!
Matthias
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 19:07
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
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#10

Re: TFIleStream und Pointer

  Alt 4. Nov 2004, 19:19
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz