Entwickler-Ecke

Sonstiges (Delphi) - Gauge will nicht funktionieren


sintec - Mi 23.05.07 11:17
Titel: Gauge will nicht funktionieren
Hallo an alle,

Ich habe ein Problem mit der Gauge und zwar: bekomme ich ständig beim kompilieren die Meldung " Feld Form1.Gauge besitzt keine entsprechende Komponente. Soll die Deklaration entfernt werden?"

Wenn man "ja" anklickt löscht er die Zeile "Gauge: TGauge;" und wenn man auf "nein" klickt, kompiliert er das Programm. Aber wenn man das Programm jetzt benutzen will, gibts den Fehler "Zugriffsverletzung bei Adresse 00443AE7 in Modul 'Form1.exe'. Lesen von Adresse 00000057." und zwar bei der ersten Zeile wo was mit Gauge steht (in meinem Fall "gauge.MaxValue := max;").

Kann mir einer helfen?


ZeitGeist87 - Mi 23.05.07 11:25

Entfern die Gauge vom Formular und gegebenenfalls auch die Deklaration oben und setz anschließend wieder ein auf die Form, und nenn sie wie die Alte.

LG
Stefan


sintec - Mi 23.05.07 11:33

user profile iconZeitGeist87 hat folgendes geschrieben:
Entfern die Gauge vom Formular und gegebenenfalls auch die Deklaration oben und setz anschließend wieder ein auf die Form, und nenn sie wie die Alte.

LG
Stefan


Was meinst du mit auf die Form setzen?


Delete - Mi 23.05.07 11:55

user profile iconsintec hat folgendes geschrieben:
Was meinst du mit auf die Form setzen?

Die Komponente in der Komponetenleiste auswählen mit der Maus. Linke Maustaste gedrückt halten und ganz langsam die Maus über das Formular ziehen. Befindet sich der Mauszeiger über dem Formular, linke Maustaste loslassen. Diesen Vorgang bezeichnet man unteranderem als "auf die Form setzen". :?


sintec - Mi 23.05.07 12:07

user profile iconLuckie hat folgendes geschrieben:
user profile iconsintec hat folgendes geschrieben:
Was meinst du mit auf die Form setzen?

Die Komponente in der Komponetenleiste auswählen mit der Maus. Linke Maustaste gedrückt halten und ganz langsam die Maus über das Formular ziehen. Befindet sich der Mauszeiger über dem Formular, linke Maustaste loslassen. Diesen Vorgang bezeichnet man unteranderem als "auf die Form setzen". :?


ich habe aber die Komponente nicht in der Komponetenleiste, also kann ich es auch nicht auf die form ziehen. Das wird irgendwie nur als Gauge.pas geöffnet mit reinem Quellcode.


Smikey - Mi 23.05.07 12:10

F12

mfg smikey


Blackheart666 - Mi 23.05.07 12:10

Was hast Du denn für eine Delphiversion, TGauge unter Beispiele.


sintec - Mi 23.05.07 12:24

Ich benutze den TurboExplorer für Delphi.

unter C:\Programme\Borland\BDS\4.0\source\Win32\Samples\Source habe ich ja die Gauge.pas die kann ich auch öffnen, aber dann bekomme ich nur reines Quellcode.
Als Komponente in der Komponentenliste gibts die dann auch nicht.


Stefan.Buchholtz - Mi 23.05.07 12:31

bei den kostenlosen Turbo-Versionen kann man Komponenten nicht in die IDE installieren, um sie im Formulardesigner zu verwenden.
Deswegen kannst du die Komponente auch nicht zur Designzeit auf dem Formular haben.

Dir wird nichts anderes übrigbleiben als die Komponente aus dem Formular entfernen zu lassen und sie dann zur Laufzeit, z.B. im FormCreate-Event selbst zu erzeugen und die Properties zuzuweisen.

Stefan


Blackheart666 - Mi 23.05.07 12:34

Dann versuch mal die Komponente zu erzeugen, weiss nicht genau ob das klappt.
Bei Uses Gauges

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  MyGauge:TGauge;
begin
  MyGauge:=TGauge.Create(Self);
  MyGauge.Parent:=Form1;
  MyGauge.Top:=100;
  MyGauge.Left:=100;
end;


ZeitGeist87 - Mi 23.05.07 12:37

user profile iconBlackheart666 hat folgendes geschrieben:
Dann versuch mal die Komponente zu erzeugen, weiss nicht genau ob das klappt.
Bei Uses Gauges

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  MyGauge:TGauge;
begin
  MyGauge:=TGauge.Create(Self);
  MyGauge.Parent:=Form1;
  MyGauge.Top:=100;
  MyGauge.Left:=100;

//Namen nicht vergessen
MyGauge.Name:= 'Gaugexyz';

end;


Nimm doch die Progressbar her :)

LG
Stefan


Stefan.Buchholtz - Mi 23.05.07 12:40

Ein Name ist bei zur Laufzeit erzeugten Komponenten nicht wirklich nötig.

Stefan


ZeitGeist87 - Mi 23.05.07 12:45

user profile iconStefan.Buchholtz hat folgendes geschrieben:
Ein Name ist bei zur Laufzeit erzeugten Komponenten nicht wirklich nötig.

Stefan



hmm und wenn er mehrere hat und sie ansprechen will?
Ok er kanns über ne globale Variable lösen, aber ich finds einfach besser, den Komponenten eindeutige Namen zu geben..


Stefan.Buchholtz - Mi 23.05.07 13:10

user profile iconZeitGeist87 hat folgendes geschrieben:
hmm und wenn er mehrere hat und sie ansprechen will?
Ok er kanns über ne globale Variable lösen, aber ich finds einfach besser, den Komponenten eindeutige Namen zu geben..


Ich würde dann einfach in der Formularklasse Felder für die Komponenten deklarieren - natürlich keine globalen Variablen, die sind bäh :wink:

Also so:


Delphi-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:
type
  TForm1 = class(TFrom)
    ....
  private
    Gauge1 : TGauge; // in einem realen Programm natürlich vernünftige Namen verwenden
    Gauge2 : TGauge;
    ...
  public
    ...
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  Gauge1 := TGauge.Create(self);
  Gauge1.Parent := self;
  Gauge1.Top := 100;
  Gauge1.Left := 100;
  ...

  Gauge2 := TGauge.Create(self);
  Gauge2.Parent := self;
  Gauge2.Top := 120;
  Gauge2.Left := 100;
  ...
end;


Dann kann man die weiter wie im Formulardesigner erzeugte Komponenten verwenden.

Der Formulardesigner erzeugt das Feld nur automatisch und gibt ihm den gleichen Namen wie die Komponente, damit das Streaming-System beim Erzeugen des Formulars die Komponente dem Feld im Formularobjekt zuweisen kann. Das passiert hier zu Fuss im FormCreate, der Name der Komponente selbst wird also nie verwendet und ist überflüssig.

Stefan


sintec - Mi 23.05.07 13:36

Das ist Super. Funktioniert wunderbar.

Vielen Dank

Aber das Problem mit der Meldung " Feld Form1.Gauge besitzt keine entsprechende Komponente. Soll die Deklaration entfernt werden?" habe ich immer noch.


ZeitGeist87 - Mi 23.05.07 13:47

Quelltext posten!

ZackZack :)


sintec - Mi 23.05.07 14:06


Delphi-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:
unit EWFileSave;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, shlobj, ComCtrls, AppEvnts, ExtCtrls, IniFiles,
  Ergebnis, Meldung, Gauges;

type
  TShutdownWindowsType = (swtShutdown, swtShutdownPowerOff, swtRestart, swtLogoff);
  TFileSave = class(TForm)
    Gauge: TGauge;
...
procedure TFileSave.FormCreate(Sender: TObject);
begin  
  Gauge := TGauge.Create(self);
  Gauge.Parent := self;
  Gauge.Top := 370;
  Gauge.Left := 8;
  Gauge.Width := 419;
  Gauge.Height := 20;
  Gauge.Visible := false;
end;


Ich hoffe das reicht, denn der Code ist über 750 Zeilen lang.

Wenn ich bei der Meldung auf "Ja" klicke, löscht er die 13. Zeile.


ZeitGeist87 - Mi 23.05.07 14:16

user profile iconsintec hat folgendes geschrieben:

Delphi-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:
unit EWFileSave;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, shlobj, ComCtrls, AppEvnts, ExtCtrls, IniFiles,
  Ergebnis, Meldung, Gauges;

type
  TShutdownWindowsType = (swtShutdown, swtShutdownPowerOff, swtRestart, swtLogoff);
  TFileSave = class(TForm)
    Gauge: TGauge; //Raus da
   private
    Gauge: TGauge; //und da rein
   public
    Gauge: TGauge; //oder da rein
   end;
...
procedure TFileSave.FormCreate(Sender: TObject);
begin  
  Gauge := TGauge.Create(self);
  Gauge.Parent := self;
  Gauge.Top := 370;
  Gauge.Left := 8;
  Gauge.Width := 419;
  Gauge.Height := 20;
  Gauge.Visible := false;
end;


Ich hoffe das reicht, denn der Code ist über 750 Zeilen lang.

Wenn ich bei der Meldung auf "Ja" klicke, löscht er die 13. Zeile.


sintec - Mi 23.05.07 14:22

gg :lol: man bin ich Blöd :lol:

Vielen Dank


sintec - Fr 25.05.07 13:39

Hallo nochmal,

ich habe ein kleines Problem mit der Gauge und zwar: wollte ich die Gauge auch in einem anderem Tool benutzen und bei dem Programm war früher ein ProgressBar auf einem Frame. Das Frame hat aber kein Ereignis namens FrameCreate oder FormCreate also kann ich es nicht zur Laufzeit erzeugen.

wie kann ich dann sonst machen?


ZeitGeist87 - Fr 25.05.07 13:55

user profile iconsintec hat folgendes geschrieben:
Hallo nochmal,

ich habe ein kleines Problem mit der Gauge und zwar: wollte ich die Gauge auch in einem anderem Tool benutzen und bei dem Programm war früher ein ProgressBar auf einem Frame. Das Frame hat aber kein Ereignis namens FrameCreate oder FormCreate also kann ich es nicht zur Laufzeit erzeugen.

wie kann ich dann sonst machen?


Wie wärs im OnFormCreate?


sintec - Fr 25.05.07 13:59

user profile iconZeitGeist87 hat folgendes geschrieben:

Wie wärs im OnFormCreate?


meinst du bei dem Hauptfenster?

dann macht er mir die Gauge im Hauptfenster aber nicht im Frame!!


Stefan.Buchholtz - Fr 25.05.07 14:02

Du kannst einfach den Constructor des Frames überschreiben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TMyFrame = class(TFrame)
    ...
  public
    constructor Create(AOwner: TComponent); override;
    ...
  end;

...


constructor TMyFrame.Create(AOwner: TComponent);
begin
  inherited;
  
  Gauge := TGauge.Create(self);
  ...
end;


Stefan