Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Neues Fenster erstellen (https://www.delphipraxis.net/26421-neues-fenster-erstellen.html)

daniel8520 23. Jul 2004 15:58


Neues Fenster erstellen
 
Hallo Leute,

ich bin grad voll am verzweifeln. Ich bin grad dabei so nen kleinen Browser zu proggen. Dafür hab ich auch so ne Art Downloadmanager gebastelt-besser gesagt: Ich bin noch dabei. Und jetzt fangen meine Probleme an.
Ich wollte es so handhaben, dass wenn die Endung der Datei in der Adressleiste z.B. 'exe' ist ein kleines Form (nennen wir es DownloadForm) aufgeht, und die datei herunterlädt. Funktionier auch. Nun wollte ich aber so haben, dass ich bzw. der User nicht nur eine datei runterladen kann, sondern mehrere DownloadForms gleichzeitig auf haben kann. Ich dachte, man kann das so lösen:

Delphi-Quellcode:
.
.
.
var
  Fenster: TDownloadForm;
begin
  Fenster := TDownloadForm.Create(MainForm);
  Fenster.StartDownload(URL);
end;
In der Prozedur Fenster.StartDownload steht folgended:
Delphi-Quellcode:
var
  DownloadingFileName: String;
  DownloadingFilePath: String;
begin
  DownloadingFileName := GetFileNameOfURL(URL);
  DownloadingFilePath := GetPathOfDataURL(URL);
  FileNameLabel.Caption := DownloadingFileName;
  OrtLabel.Caption := DownloadingFilePath;
  Save.FileName := DownloadingFileName;
  URLOfFile := URL;
  DownloadDataForm.Show;
end;
Wenn ich das DownloadForm jetzt klassisch über DownloadForm.StartDownload(URL); aufrufe klappt alles prima!
Rufe ich es aber wie oben beschreiben über meine Fenster Variable auf, klappt außer dem DownloadForm.Show; nichts.
D.h. die Label's z.B. bekommen keine neue Caption usw.

Kann mir evtl. jemand sagen, woran das liegen könnte?

mirage228 23. Jul 2004 16:03

Re: Neues Fenster erstellen
 
Delphi-Quellcode:
var
  DownloadingFileName: String;
  DownloadingFilePath: String;
begin
  DownloadingFileName := GetFileNameOfURL(URL);
  DownloadingFilePath := GetPathOfDataURL(URL);
  FileNameLabel.Caption := DownloadingFileName;
  OrtLabel.Caption := DownloadingFilePath;
  Save.FileName := DownloadingFileName;
  URLOfFile := URL;
  // DownloadDataForm.Show;
  Self.Show; // <-- !!
end;
mfG
mirage228

roderich 23. Jul 2004 16:04

Re: Neues Fenster erstellen
 
ja.

Delphi-Quellcode:
DownloadDataForm.Show;
laß einfach DownloadDataForm. weg oder schreibe Self.

am besten entferne auch gleich die automatisch von Delphi angelegte Variable DownloadDataForm, dann kannst du darauf später nicht mehr reinfallen.

Roderich

roderich 23. Jul 2004 16:06

Re: Neues Fenster erstellen
 
@mirage228
wir sollten heiraten, denken das gleiche :lol:

Roderich

daniel8520 23. Jul 2004 16:12

Re: Neues Fenster erstellen
 
Cool!
EINIGES klappt jetzt schon!
Also die Labels bekommen jetzt die Caption, die sie bekommen sollen.
Wenn ich das problem richtig verstanden hatte, lag es daran, dass ich DownForm hab anzeigen lassen, aber in einer Kopie von DownForm sachen geändert hab.
Nun hab ich ein weiteres Problem:
Meine Download-Routine (URLDownloadToFileURLDownloadToFile) ist ja eine eigene Klasse, in der Routine werden allerdings Dinge in dem DownForm geändert. Nun würde ich denken, dass die deshlab nicht funktioniert, weil ich ja nicht DownForm sehe, sondern nur eine Kopie. aber ich kann in der Routine ja nun schlecht mit Self arbeiten, da es ja eine eigene Klasse ist.
Noch was: Der Download an sich funktioniert nur die Fortschritsanzeige etc. funkt nicht.

Hat jemand eine Idee?

mirage228 23. Jul 2004 16:38

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Cool!
EINIGES klappt jetzt schon!
Also die Labels bekommen jetzt die Caption, die sie bekommen sollen.
Wenn ich das problem richtig verstanden hatte, lag es daran, dass ich DownForm hab anzeigen lassen, aber in einer Kopie von DownForm sachen geändert hab.
Nun hab ich ein weiteres Problem:
Meine Download-Routine (URLDownloadToFileURLDownloadToFile) ist ja eine eigene Klasse, in der Routine werden allerdings Dinge in dem DownForm geändert. Nun würde ich denken, dass die deshlab nicht funktioniert, weil ich ja nicht DownForm sehe, sondern nur eine Kopie. aber ich kann in der Routine ja nun schlecht mit Self arbeiten, da es ja eine eigene Klasse ist.
Noch was: Der Download an sich funktioniert nur die Fortschritsanzeige etc. funkt nicht.

Hat jemand eine Idee?

*schnipp* Ich! ;)

Übergeb der Klasse dann immer die aktuelle Instanz von TDownloadForm.
Du speicherst diese dann immer in einem privaten Feld der Klasse und greifst dann auf diese zu.

mfG
mirage228

daniel8520 23. Jul 2004 16:42

Re: Neues Fenster erstellen
 
Woah!
Sorry aber son profi bin ich dann doch nicht!
Kannst du mal kurz erläutern, wie das dann in etwa aussieht!
Und, was ist denn eine Instanz?

mirage228 23. Jul 2004 16:48

Re: Neues Fenster erstellen
 
Hi,

wenn du diese Klasse ( http://www.delphipraxis.net/internal...downloadtofile ) verwendest, dann könntest du diese folgendermaßen ändern.
  • Füge unter "private" eine variable FForm vom Typ TDownloadForm ein.
  • Erstelle einen "public" Abschnitt in die Klasse.
  • Optional: Füge unter public einen Konstruktor ein, dem du als Parameter eine Variable vom Typ TDownloadForm übergibst, die im Konstruktor-Code in FForm gespeicher wird.
  • Schreibe in den public-Abschnitt folgende Zeile: property Form: TDownloadForm read FForm write FForm

Jetzt musst du im Code alle aufrufe von DownloadForm durch FForm (bzw. Form) ersetzen.

Nun musst du immer das aktuell ausgewählte Form der Klasse übergeben und schon funktionierts ;)

mfG
mirage228

daniel8520 23. Jul 2004 16:59

Re: Neues Fenster erstellen
 
Ähm, ja.

Zwei Sachen noch:
1. Wann muss ich denn FForm nehmen, und wann Form?
2.
Zitat:

Nun musst du immer das aktuell ausgewählte Form der Klasse übergeben und schon funktionierts
hab ich nicht verstanden! Sorry!

Kannst du es mir bitte erklären?

mirage228 23. Jul 2004 17:06

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Ähm, ja.

Zwei Sachen noch:
1. Wann muss ich denn FForm nehmen, und wann Form?
2.
Zitat:

Nun musst du immer das aktuell ausgewählte Form der Klasse übergeben und schon funktionierts
hab ich nicht verstanden! Sorry!

Kannst du es mir bitte erklären?

zu 1) Das ist in diesem Fall eigentlich egal, welches du nimmst. ;)

zu 2) In dem Fall, dass du in der DownloadForm selbst die Klasse erstellst und auch wieder freigibst, musst du einfach cDownStatus := cDownloadStatusCallBack.Create(Self); schreiben.

mfG
mirage228

daniel8520 23. Jul 2004 17:07

Re: Neues Fenster erstellen
 
Aber wo soll ich das denn rein schreiben?
Wenn ich schreibe, bevor ich den Download an sich starte, brauch ich den Paramater (Self) nicht!
Und wenn ich dann überall Form bzw. FForm eingesetzt hab, funkt's trotzdem nicht.

thx für bissheriges

EDIT:
Jetzt klappt nichtmal mehr der Download an sich. das progg hängt dann einfach ohne jegliche Meldung.

mirage228 23. Jul 2004 17:14

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Aber wo soll ich das denn rein schreiben?
Wenn ich schreibe, bevor ich den Download an sich starte, brauch ich den Paramater (Self) nicht!
Und wenn ich dann überall Form bzw. FForm eingesetzt hab, funkt's trotzdem nicht.

thx für bissheriges

Wo erstellst du denn cDownStatus bzw. wo rufst du URLDownloadToFile auf? Im Konstruktor von TDownloadForm?

Das FForm respresäntiert nämlich die Download-Form, an die die Klasse ihre Werte übergeben soll...

mfG
mirage228

daniel8520 23. Jul 2004 17:16

Re: Neues Fenster erstellen
 
Ich erstelle cDownStatus bzw. beginne mit URLDownloadToFile nach einem Klick auf einen Button.

mirage228 23. Jul 2004 17:24

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Ich erstelle cDownStatus bzw. beginne mit URLDownloadToFile nach einem Klick auf einen Button.

Wenn dieser Button sich auf dem Download-Formular befindet, musst du lediglich Self an den Konstruktor übergeben.
FForm müsste dann = Self sein und die Klasse wird die Werte auf FForm (also auf dem aktuellen Formular) ausgeben.

mfG
mirage228

daniel8520 23. Jul 2004 17:32

Re: Neues Fenster erstellen
 
Ich nehme an, ich soll Self an den Konstruktor von cDownStatusCallback übergeben.
Nur ich kann kein Self an den Konst. von cDownStatusCallback übergeben. Das sind ihm dann zu viel Parameter.

Ich kapier's nicht!
Bitte helfen!!!

mirage228 23. Jul 2004 17:36

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Ich nehme an, ich soll Self an den Konstruktor von cDownStatusCallback übergeben.
Nur ich kann kein Self an den Konst. von cDownStatusCallback übergeben. Das sind ihm dann zu viel Parameter.

Ich kapier's nicht!
Bitte helfen!!!

Hi,

du musst diese Änderung an der Klasse durchführen:
Zitat:

Zitat von mirage228
Füge unter public einen Konstruktor ein, dem du als Parameter eine Variable vom Typ TDownloadForm übergibst, die im Konstruktor-Code in FForm gespeicher wird.

Konkret sähe das in etwa so aus
Delphi-Quellcode:
type
  cDownStatusCallback = class(...)
  private
    // ...
    FForm: TDownloadForm;
  public
    property Form: TDownloadForm read FForm write FForm;
    constructor Create(aForm: TDownloadForm);
end;

// ...

constructor cDownStatusCallback.Create(aForm: TDownloadForm);
begin
  FForm := aForm;
end;

// Und dann halt noch in den Prozeduren FForm einsetzen...
mfG
mirage228

daniel8520 23. Jul 2004 17:43

Re: Neues Fenster erstellen
 
Puh!
Jetzt hast du es geschaft! Ich hab's jetzt endlich hinbekommen! Mich hatte nur dein "optional" vor dem Konstruktor verwirrt!
Aber trotzdem ein ganz dickes fettes Danke!!!

:dp: and mirage228!

mirage228 23. Jul 2004 17:44

Re: Neues Fenster erstellen
 
Zitat:

Zitat von daniel8520
Puh!
Jetzt hast du es geschaft! Ich hab's jetzt endlich hinbekommen! Mich hatte nur dein "optional" vor dem Konstruktor verwirrt!
Aber trotzdem ein ganz dickes fettes Danke!!!

:dp: and mirage228!

Gerngeschehen :firejump: :zwinker:

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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-2025 by Thomas Breitkreuz