AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Probleme mit Frames und deren Aktualisierung in Formularen
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Frames und deren Aktualisierung in Formularen

Ein Thema von Alex_ITA01 · begonnen am 23. Nov 2004 · letzter Beitrag vom 10. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 25. Jun 2006, 20:09
Ja, hab ich schon ausprobiert, hilft nicht. Das Problem ist ja nicht das sich die Progressbar nie bewegt, sie bewegt sich nur nicht wenn ich das ganze mit dynamisch erzeugten Frames mache, bei nicht-dynamischen Frames geht es.
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 26. Jun 2006, 20:21
nochmal

*push*

sry
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 27. Jun 2006, 00:45
Hallo Sko,

ich habe mal ein Beispiel gemacht. Was du da allerdings für einen Stream hast und wie das gehen soll, blicke ich noch nicht so. Da reicht dein Codeschnipsel nicht aus.

Gruss
Thorsten
Angehängte Dateien
Dateityp: zip downloadwindows_173.zip (5,3 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 27. Jun 2006, 18:29
vielen Dank! ich sehs mir gleich mal an
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 28. Jun 2006, 09:00
Wie sieht denn die Aktualisierungsrate des Timers aus?
Ich persönlich würde einen Thread nehmen, da die Timer sich gegenseitig behaken könnten(glaub ich) d.h. während der eine Timer in seinem OnTimer-Event ist, springt ein zweiter in seine bevor der erste sein Event fertig ausgeführt hat. Bei Threads hättest du das Problem denk ich nicht.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 29. Jun 2006, 23:33
Ich habs jetzt so gebaut wie in omata´s Beispiel, das ist genau das was ich wollte, vielen Dank nochmal dafür . Aber ich glaub ich hab da irgendwas bei der Anpassung falsch gemacht: wenn das Fenster, in das die Frames kommen, schon vor der Erstellung des Frames angezeigt wird, friert das Programm ab dem Zeitpunkt der Erstellung des Frames für die Dauer der Datenübertragung ein und beim Beenden des Programms kommt "Ungültiges Fensterhandle", außerdem wird der Frame sofort nach der Übertragung vom Formular entfernt, das hab ich - jedenfalls bewusst - garnicht eingebaut. Wenn das Fenster geschlossen ist, und ich es nach dem Zeitpunkt der Erstellung des Frames erst öffne, geht alles, nichts ist eingefroren, alles läuft wie´s soll und der Frame bleibt auch nach dem Ende der Übertragung da . Hier mal die entsprechenden Code-Schnipsel, ich hoffe ihr könnt mir helfen:

Hier wird das erstellen ausgelöst:
Delphi-Quellcode:
procedure TMainForm.TCPReceiverExecute(AContext: TIdContext);
var
  SizeOfIncomingStream: Integer;
  IDS: TidStreamVCL;
  DateiFrame: TFDatei;
  Target, DGroesse: string;
  DStream: TFileStream;
begin
  if DateiGroesse < 1048576 then DGroesse := RealToStr(DateiGroesse/1024) + ' KB'; //Dateigröße ist eine globale int64 Variable
  if DateiGroesse > 1048576 then DGroesse := RealToStr(DateiGroesse/1024/1024) + ' MB';
  if DateiGroesse > 1073741824 then DGroesse := RealToStr(DateiGroesse/1024/1024/1024) + ' GB';
  DateiFrame := FDownLoad.add(Target, DGroesse); //<-hier wird der Frame erstellt
  DStream := DateiFrame.FStream;
  Application.ProcessMessages;
  try
    IDS := TidStreamVCL.Create(DStream);
    try
      with AContext.connection do
      begin
        try
          SizeOfIncomingStream := Socket.ReadInteger;
          Socket.ReadStream(IDS, SizeOfIncomingStream);
        finally
          Disconnect;
        end;
      end;
      IDS.VCLStream.Position := 0;
    finally
      FreeAndNil(IDS);
    end;
  finally
    with DateiFrame do
    begin
      Bar.Position := 100;
      Fertig := true;
      FStream.Free;
    end;
  end;
end;
So sieht das der Code für´s Downloadfenster aus:
Delphi-Quellcode:
unit DownLoadForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Math, EmpfDatei, StdCtrls;

type
  TLoadForm = class(TForm)
    SBDateien: TScrollBox;
    BAuf: TButton;
    procedure BAufClick(Sender: TObject);
  private
    { Private-Deklarationen }
    DownloadListe: TList;
    LTimer: TTimer;
  public
    { Public-Deklarationen }
    constructor create(AOwner:TComponent); reintroduce;
    destructor destroy; override;
    procedure TimerUpdate(Sender:TObject);
    function add(Dateiname, Dateigroesse: string): TFDatei;
    procedure del(Index:integer);
    function count:integer;
  end;

var
  LoadForm: TLoadForm;

implementation

{$R *.dfm}

function TLoadForm.count: integer;
begin
  Result := DownloadListe.Count;
end;

constructor TLoadForm.create(AOwner: TComponent);
begin
  inherited create(AOwner);
  DownloadListe:=TList.Create;
  LTimer := TTimer.Create(Self);
  LTimer.Interval := 500;
  LTimer.Enabled := false;
  LTimer.OnTimer := TimerUpdate;
end;

destructor TLoadForm.destroy;
var
  i: integer;
begin
  for i := 1 to DownloadListe.Count do
    TFDatei(DownloadListe[i-1]).free;
  DownloadListe.free;
  LTimer.free;
  inherited;
end;

procedure TLoadForm.TimerUpdate(Sender: TObject);
var i:integer;
begin
  for i:=1 to DownloadListe.Count do
    TFDatei(DownloadListe[i-1]).Refresh;
  Application.ProcessMessages;
end;

function TLoadForm.add(Dateiname, Dateigroesse: string): TFDatei;
var
  FrameDownload: TFDatei;
  ID, i: integer;
begin
  i := 0;
  ID := 0;
  while (i < DownloadListe.Count) do
  begin
    ID := Max(ID, TFDatei(DownloadListe[i]).ID);
    inc(i);
  end;
  inc(ID);
  FrameDownload:=TFDatei.create(Self, ID, Dateiname, Dateigroesse);
  FrameDownload.Parent:=SBDateien;
  FrameDownload.Align:=alTop;
  LTimer.Enabled := true;
  DownloadListe.Add(FrameDownload);
  for i := 1 to DownloadListe.Count do
    TFDatei(DownloadListe[i-1]).Align:=alBottom;
  for i := 1 to DownloadListe.Count do
    TFDatei(DownloadListe[i-1]).Align:=alTop;
  result := FrameDownload;
  BAuf.Enabled:=(DownloadListe.Count > 0);
end;

procedure TLoadForm.del(Index: integer);
begin
  if (Index >= 0) and (Index < DownloadListe.Count) then begin
    TFDatei(DownloadListe[Index]).free;
    DownloadListe.Delete(Index);
    LTimer.Enabled := (DownloadListe.Count > 0);
    BAuf.Enabled := (DownloadListe.Count > 0);
  end;
end;

procedure TLoadForm.BAufClick(Sender: TObject);
var
  i: integer;
begin
  i := 0;
  while (i < DownloadListe.Count) do
  begin
    if TFDatei(DownloadListe[i]).Fertig then
    begin
      del(i);
    end
    else
      inc(i);
  end;
end;

end.
und so der Code vom Frame:
Delphi-Quellcode:
unit EmpfDatei;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls, ShellAPI;

type
  TFDatei = class(TFrame)
    Label1: TLabel;
    Label2: TLabel;
    LName: TLabel;
    LGroesse: TLabel;
    Bar: TProgressBar;
    Label3: TLabel;
    IIcon: TImage;
    LTyp: TLabel;
    Bevel1: TBevel;
  private
    { Private-Deklarationen }
    DID: integer;
  public
    FileName: String;
    DateiGroesse: Int64;
    FStream: TFileStream;
    DFertig: boolean;
    constructor create(AOwner:TComponent;
                       ID:integer;
                       Dateiname, Dateigroesse: string); reintroduce;
    destructor destroy; override;
    procedure Refresh;
    property Fertig: boolean read DFertig write DFertig;
    property ID: integer read DID;
  end;

implementation

uses ErwEinstellungen, Main;

{$R *.dfm}

function FileIcon(FileName: String): TIcon;
var
  FileInfo: TSHFileInfo;
  AIcon: TIcon;
begin
  FillChar(FileInfo,SizeOf(FileInfo),#0);
  SHGetFileInfo(PChar(FileName),0,FileInfo,SizeOf(FileInfo),SHGFI_ICON or SHGFI_LARGEICON);
  AIcon:=TIcon.Create;
  Try
    AIcon.Handle:=FileInfo.HIcon;
    AIcon.Transparent:=True;
  Except end;
  Result:=AIcon;
end;

function FileType(FileName: String): string;
var
  FileInfo: TSHFileInfo;
begin
  FillChar(FileInfo,SizeOf(FileInfo),#0);
  SHGetFileInfo(PChar(FileName),0,FileInfo,SizeOf(FileInfo),SHGFI_TYPENAME);
  Result := FileInfo.szTypeName;
end;

constructor TFDatei.create(AOwner: TComponent;
                                  ID:integer;
                                  Dateiname, Dateigroesse:string);
begin
  inherited create(AOwner);
  Self.Name := 'FrameDownload' + IntToStr(ID);
  LName.Caption := ExtractFileName(Dateiname);
  LTyp.Caption := FileType(Dateiname);
  LGroesse.Caption := Dateigroesse;
  IIcon.Picture.Icon := FileIcon(DateiName);
  FStream := TFileStream.Create(Dateiname, fmCreate);
  DFertig:=false;
  DID := ID;
end;

destructor TFDatei.destroy;
begin
  inherited;
end;

procedure TFDatei.Refresh;
begin
  if not DFertig then
  begin
    if (FStream <> nil) and (FStream.Position <> 0) then
      Bar.Position := round((FStream.Position * 100) / FStream.Size);
  end;
  Bar.Update;
end;

end.
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#17

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 30. Jun 2006, 00:26
Hi Sko,

Du machst das ja von hinten mit der Faust durchs Auge

Frage 1: Warum Frames ?
Du könntest eine Download-Form erstellen wo nichts drin ist ausser einer Scrollbox oder einem Panel je nach dem was Dir lieber ist.

Für jeden Download erstellst Du dynamisch ein Panel als Parent für das dynamisch erzeugte Panel nimmst Du das Panel oder die Scrollbox die schon auf der Form ist.
Absolut gleiches aussehen wie in Firefox, habe das selber schon mit Indy so in einem Projekt gemacht.

Frage 2: Warum Timer ?
Vergiss den Timer das kann nur schief gehen. Du solltest für jeden Download einen Thread erstellen oder noch eleganter Du schreibst Dir eine eigene Download-Klasse die von TThread erbt und das dynamische erzeugen und zerstören der Panels übernimmt. Im Thread selber musst Du den Download Fortschritt SYNCRONISIERT anzeigen.

*** EDIT ***
Schau Dir mal die Sourcen meiner Demo an :
Versenden von Dateien mit Indy9

Ganz besonders solltest Du Dir die Klasse FileReceiver.pas anschauen im Server-Teil, ist eigentlich genau das was Du suchst
*** EDIT ***

Hoffe Du kannst mit meiner Erklärung was anfragen,

Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 30. Jun 2006, 20:35
Hmm, na gut, ich werds mir mal ansehen, ich dachte ich komm um die Threads herum, ich war froh als der eine in dem Programm lief (für´s Senden von Dateien). Nur wundert mich das trotzdem etwas, denn eigentlich hab ich omatas Beispiel nur angepasst und das Beispiel funktioniert ja. Na dann werd ich mich nochmal mit Threads auseinandersetzen
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Probleme mit Frames und deren Aktualisierung in Formular

  Alt 10. Jul 2006, 10:18
So, jetz gehts: ich habe eine neue Klasse von TThread abgeleitet die sich mit Synchronize um die Erstellung und Aktualisierung der Frames kümmert. Vielen Dank nochmal an omata für das Beispiel und an Angel4585 und DataCool für den Tipp mit dem Thread .
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:11 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