Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi eigener Typ in Form1, wie von einer Unit zugreifen? (https://www.delphipraxis.net/74762-eigener-typ-form1-wie-von-einer-unit-zugreifen.html)

Mazel 8. Aug 2006 12:56


eigener Typ in Form1, wie von einer Unit zugreifen?
 
Hallo,

ich habe ein kleines Problem mit einen eigenen Typ, es ist eine Klasse. Ich habe eine einzelne Unit in der einige Prozeduren sind, nun kann ich aber leider nicht auf den Typ zugreifen, obwohl ich die Form1 in der uses Klausel eingebunden habe:

Delphi-Quellcode:
//Form1
unit Form_1;

interface

uses
 Windows, Messages, SysUtils, ..., Graphics, Controls, Forms;

type
 TMediaObject = class          //mein eigener Typ
  private
    { Private-Deklarationen }
    PCharFileName: PChar;
    FileName: String;
    FileExt: String;
    FileType: Integer;
  public
    { Public-Deklarationen }
  end;

type
 TForm1 = class(TForm)
    MainMenu: TMainMenu;
    FileM: TMenuItem;
    ..
    ..
   
var
 Form1: TForm1;
 MediaObject: TMediaObject;
Delphi-Quellcode:
unit Unit1;

interface

uses
 Forms, Form_1, ..., UnitConst, IniFiles Dialogs, ComCtrls;
 
 function SetData(FileName: String): Boolean;
 function InstallExt(Ext, ExtDescr, FileDescr, OpenWith: String): Boolean;
 function UnInstallExt(Ext, ExtDescr: String): Boolean;
 procedure GetError(Msg, Code: String);
 procedure SetFormsPosition(TopForm, X1, X2, X3: Integer);
 procedure RestoreSettings;
 
implementation


function SetData(FileName: String): Boolean;
begin
 If MediaObject.FileName = FileName then Result:=True; //Hier ist das Problem
end;
Wie kann ich auf den Typ bzw. auf die Variable "MediaObject", die global in der Form1 deklariert ist, in der Unit1 zugreifen? Muss ich dazu den Typ woanders hinterlegen, wenn ja: wo?

Gruß
Mazel

arbu man 8. Aug 2006 12:59

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Delphi-Quellcode:
If MediaObject.FileName = FileName then Result:=True; //Hier ist das Problem
Es wäre Zuckersüß von dir, wenn du uns jetzt auch noch sagen würdest was das für ein Problem ist, was sagt denn der Compiler da es eigentlich funktionieren müsste...

Angel4585 8. Aug 2006 13:01

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Wurde das Objekt irgendwo erzeugt?
Hats du die Unit in deiner zweiten Unit eingebunden(in der Uses-klausel)?

Edit: zum Erzeugen würde ich den Initialization-Bereich nehmen, da du das Objekt scheinbar dauerhaft/von Anfang an brauchst.

Mazel 8. Aug 2006 13:04

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Oh,

sorry, habe ich vergessen:

Delphi-Quellcode:
//auch in der Unit1
 MediaObject:=TMediaObject.Create; //erzeugen kann ich es aber nicht auf die Variablen zugreifen
 MediaObject.FileName:='test'; //hier der Fehler
[Fehler] Unit1.pas(1080): Undefinierter Bezeichner: 'FileName'

arbu man 8. Aug 2006 13:08

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Du musst die var Filename als public deklarieren
Delphi-Quellcode:
public
  filename: string;
  ...

EDatabaseError 8. Aug 2006 13:10

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Weil die Variablen Private sind ;-) tu sie in den public Block dann gehts ;-)

mfg


//ROT

ManuMF 8. Aug 2006 13:10

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Jetzt will ich aber auch noch ;-)

In private kannst du nur im TMediaObject zugreifen, nicht außerhalb.

Mazel 8. Aug 2006 13:11

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
:wall:

Ja, danke. Da der Type ganz oben in der Form deklariert ist, habe ich alle Variablen private deklariert, weil ich dachte die würden dann sowieso public sein. Ich weis nicht wie ich auf den Gedanken gekommen bin ;)

Danke

Gruß
Mazel

angos 8. Aug 2006 13:14

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Grüße,

das problem ist, dass FileName: String; im private-Bereich deklariert ist. Das ist nicht unbedingt ein Problem aber nur die halbe Miete.
1. Benenne aber vorher FileName in FFileName um! Das ist Delphikonform. Attribute einer Klasse gehen ein F zuvor.
2. Erstelle im public- Bereich eine property für FileName:

Delphi-Quellcode:
property FileName: String read FFileName write FFileName;
Über diese Property kannst du dann aus anderen Units darauf zugreifen.
Alles was im private erstellt ist kann nur innerhalb derselben unit verwendet werden.


PS:
Zitat:

In private kannst du nur im TMediaObject zugreifen, nicht außerhalb.
ist fast richtig ;)
Du kannst innerhalb der selben unit überall darauf zugreifen. In D06 (vielleicht auch D05 ?) wurde ein neuer Bereich strictprivate eingeführt. Attribute in diesem Bereich können nur von dem Objekt gesehen werden

Mazel 8. Aug 2006 15:57

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Hi,

warum muss ich eine property erstellen, dass kenn ich nur aus dem Erstellen eigener Komponenten, dort verwende ich auch das "F" vor dem eigentlichen Bezeichner.

In einm eigenen Typ hab ich das noch nie gemacht. Die Form ist doch auch eine Klasse vom Typ TForm
Delphi-Quellcode:
type
   TForm1 = class(TForm)
   private
     Button1: TButton;
     { Private-Deklarationen }
   public
     { Public-Deklarationen }
   end;
Button1 ist zwar keine Variable aber trägt hier auch kein "F".

OffTopic:
Wenn ich Variablen deklariere, wo soll ich sie deklarieren? Ich kenne viele Sourecodes bei denen die Variablen im private oder public Abschnitt oder unter var (global oder lokal) deklariert werden. ich selber deklariere sie immer unter var. Was ist nun richtig (bzw. Delphikonform) ;) ?

Gruß
Mazel

hoika 8. Aug 2006 16:40

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Hallo,

wenn du ein property benutzt und richtige Zugriffsmethode,
machst du es dir beim Debuggen leichter.

Delphi-Quellcode:
function TClass.GetFileName: String;
begin
  Result:= FFileName;
end;

procedure TClass.SetFileName(const theValue: String);
begin
  FFileName:= theValue;
end;

property FileName: String
  read GetFileName
  procedure SetFileName;
Wenn du jetzt wissen willst, wo dieser verdammt ;) falsche FileName
in deinem 1Mio. Zeilen langen Quellcode gesetzt wird,
setzt du nen Breakpoint auf "SetFileName"


Heiko

angos 9. Aug 2006 13:47

Re: eigener Typ in Form1, wie von einer Unit zugreifen?
 
Zitat:

Zitat von Mazel
Hi,

warum muss ich eine property erstellen, dass kenn ich nur aus dem Erstellen eigener Komponenten, dort verwende ich auch das "F" vor dem eigentlichen Bezeichner.

In einm eigenen Typ hab ich das noch nie gemacht. Die Form ist doch auch eine Klasse vom Typ TForm
Delphi-Quellcode:
type
   TForm1 = class(TForm)
   private
     Button1: TButton;
     { Private-Deklarationen }
   public
     { Public-Deklarationen }
   end;
Button1 ist zwar keine Variable aber trägt hier auch kein "F".

der Button dürfte jetzt auch ausserhalb dieser Unit nicht erreichbar sein ;), was ja dein eigentliches Problem war.
Normalerweise werden die Objekte eines Forms auch nicht von Delphi im private-Bereich erstellt.

Zitat:

Zitat von Mazel

OffTopic:
Wenn ich Variablen deklariere, wo soll ich sie deklarieren? Ich kenne viele Sourecodes bei denen die Variablen im private oder public Abschnitt oder unter var (global oder lokal) deklariert werden. ich selber deklariere sie immer unter var. Was ist nun richtig (bzw. Delphikonform) ;) ?

Gruß
Mazel

hier gibt es kein richtig oder falsch.... allerdings gehe ich eigentlich immer hin und vermeide globale variablen (also das was man im var erstellt). daher pack ich diese, je nach gebrauch, in den private oder public des formulars. Damit kannst du zB doppelte benennungen vermeiden.
Du kannst dir ja theoretisch in Unit1 im Var-Bereich eine Variable mit dem Namen "myString" anlegen und das gleiche in Unit2 machen.

Hoffe ich konnte helfen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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