Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei Erstellung eigener Unit (https://www.delphipraxis.net/88010-problem-bei-erstellung-eigener-unit.html)

bigmama2k 8. Mär 2007 20:01


Problem bei Erstellung eigener Unit
 
Hi @ all,

bin neu hier deswegen erstmal ein herzliches hallo Smile

Ich habe ein Problem beim erstellen einer eigenen Unit (Delphi 10 bzw. 2006)

Da es viele proceduren und funktion gibt die ich häufig benötige, habe ich mir gedacht ich bastle mir meine eigene Unit.
Diese kann ich dann einfach in meine zukünftigen Projekte einbinden etc...

Dazu habe ich folgende Ordnerstruktur:

C:\eklassen\delphi\units
C:\eklassen\delphi\VerwaltungsProjekt

Unter "Verwaltungsprojekt" habe ich eine VLC-Anwendung erstellt unter der ich meine selbst erstellen Units verwalten/testen möchte.
in c:\eklassen\delphi\units erstell ich mit diesem Projekt die Units.

Den Ordner Units habe ich auch unter Optionen zum Suchpfad für Units eingetragen.

Nun habe ich mal eine Unit erstellt, deren pas Datei liegt im Ordner "units":

Delphi-Quellcode:
unit akcode;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TAkCode = class
    function ReadRegStr(Rootkey:Cardinal; Subkey:String; Entry:String):String;
    function ReadRegInt(Rootkey:Cardinal; Subkey:String; Entry:String):Integer;
    function WriteRegValue(Rootkey:Cardinal; Subkey:String; Entry:String; What:String):boolean; overload;
    function WriteRegValue(Rootkey:Cardinal; Subkey:String; Entry:String; What:Integer):boolean; overload;
    function GetUVersion:String;
    private
    public
  end;

type
  TAkTaskMgr=class
    function LockTaskMgr:boolean;
    function UnlockTaskMgr:boolean;
    function IsLocked:boolean;
    private
    public
  end;

var
  pAkCode:TAkCode;
  pAkTaskMgr:TAkTaskMgr;

implementation

  function TAKCode.GetUVersion;
  begin
    Result :='1.1';
  end;

  function TAkCode.ReadRegStr(Rootkey: Cardinal; Subkey: string; Entry: string):String;
  var
    Reg:TRegistry;
  begin
    Result:='';
    Reg:=nil;
    try
      Reg:=TRegistry.Create;
      Reg.RootKey:=Rootkey;
      if Reg.OpenKey(Subkey,true) then
        Result:=Reg.ReadString(Entry)
      else
        Result:='ERROR';
    finally
      Reg.Free;
    end;
  end;

  function TAkCode.ReadRegInt(Rootkey: Cardinal; Subkey: string; Entry: string):Integer;
  var
    Reg:TRegistry;
  begin
    Result:=-1;
    Reg:=nil;
    try
      Reg:=TRegistry.Create;
      Reg.RootKey:=Rootkey;
      if Reg.OpenKey(Subkey,true) then
        Result:=Reg.ReadInteger(Entry)
      else
        Result:=-1;
    finally
      Reg.Free;
    end;
  end;

  function TAkCode.WriteRegValue(Rootkey: Cardinal; Subkey: string; Entry: string; What: string):boolean;
  var
    Reg:TRegistry;
  begin
    Result:=false;
    Reg:=nil;
    try
      Reg:=TRegistry.Create;
      Reg.RootKey:=Rootkey;
      if Reg.OpenKey(SubKey,true) then
      begin
        Reg.WriteString(Entry,What);
        Result:=true
      end;
    finally
      Reg.Free;
    end;
  end;

  function TAkCode.WriteRegValue(Rootkey: Cardinal; Subkey: string; Entry: string; What: Integer):boolean;
  var
    Reg:TRegistry;
  begin
    Result:=false;
    Reg:=nil;
    try
      Reg:=TRegistry.Create;
      Reg.RootKey:=Rootkey;
      if Reg.OpenKey(SubKey,true) then
      begin
        Reg.WriteInteger(Entry,What);
        Result:=true
      end;
    finally
      Reg.Free;
    end;
  end;

  function TAkTaskMgr.LockTaskMgr;
  begin
    Result := pAKCode.WriteRegValue(HKEY_CURRENT_USER,'Software\Microsoft\Windows\CurrentVersion\Policies\System','DisableTaskMgr',1);
  end;

  function TAkTaskMgr.UnlockTaskMgr;
  begin
    Result := pAKCode.WriteRegValue(HKEY_CURRENT_USER,'Software\Microsoft\Windows\CurrentVersion\Policies\System','DisableTaskMgr',0);
  end;

  function TAkTaskMgr.IsLocked;
  var
    x:Integer;
  begin
    x:= pAkCode.ReadRegInt(HKEY_CURRENT_USER,'Software\Microsoft\Windows\CurrentVersion\Policies\System','DisableTaskMgr');
    if x=1 then
      Result:=true
    else
      Result:=false;
  end;

end.

Diese Unit bzw. das Projekt "Verwaltungsprojekt" habe ich compiliert und alles läuft.

Nun erstelle ich ein neues Projekt und binde die Unit AkCode ein.
Dies funktioniert auch, d.h. er findet die pas datei.

Wenn ich nun aber hergehe und in meinem neuen Projekt z.B. folgenden Aufruf mache:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
    if pAkTaskMgr.IsLocked then
      pAkTaskMgr.UnLockTaskMgr
    else
      pAkTaskMgr.LockTaskMgr;
end;
Dann kann ich das Projekt zwar compilieren und es läuft auch alles wie es soll, er zeigt mir aber dennoch im Struktur Bildschirm unter Fehler an, dass sowohl die Variablen pAkTaskMgr etc. als auch die FUnktionen Nicht deklarierte Bezeichner seien und unterstreicht auch alles rot.

Blickt er nicht dass die Sachen in der Unit sind?
Wie kann ich ihm das weis machen?

Bitte helft mir Undecided

Es läuft zwar alles ist aber trozdem nervig wenn alles rot ist und anscheinend voller Fehler.


Danke mal im Vorab

bigmama

Klaus01 8. Mär 2007 20:04

Re: Problem bei Erstellung eigener Unit
 
-das war Quatsch - hab' es gelöscht.

Klaus

Kedariodakon 8. Mär 2007 20:06

Re: Problem bei Erstellung eigener Unit
 
Zitat:

Zitat von Klaus01
-das war Quatsch - hab' es gelöscht.

Klaus

Er arbeitet doch mit Klassen... :duck:

Bye Christian

Edit: Verdammt, er hats gemerkt bevor ich gepostet hab... :zwinker:

bigmama2k 8. Mär 2007 20:09

Re: Problem bei Erstellung eigener Unit
 
Eben wollte ich auch gerade schreiben -zwecks klassen-

ich blick nicht was das Problem sein soll, weil aufrufen kann ich ja alles, Funktionieren tut es auch
aber unterstreichen und meckern tut er trotzdem :(

Kedariodakon 8. Mär 2007 20:15

Re: Problem bei Erstellung eigener Unit
 
Also für mich sieht das auch alles korrekt aus, soll ja auch funktionieren...
Aber da ich mich nicht mit Delphi 2006 auskenne, kann ich dazu nichts sagen...

Bin noch nicht höher als Delphi 7 gekommen :cyclops:


Bye Christian

bigmama2k 8. Mär 2007 20:19

Re: Problem bei Erstellung eigener Unit
 
ja ich sag ja das ist etwas Krotesk
Es scheint irgendwie als würde sich delphi nur direkt beim Ausführen des Programmes
die aktuelle Unit "saugen" und während dem arbeiten irgend eine alte Dateiversion
die im Speicher liegt oder so.

Wenn ich mein Projekt compiliere/erstelle/debugge arbeitet er mit der aktuellsten Version
zurück im Entwicklungsmodus tut er wieder so als würde er die Funktionen nicht kennen.


HILFE
:gruebel:

inherited 8. Mär 2007 20:20

Re: Problem bei Erstellung eigener Unit
 
Stört es dich wirklich so sehr?
Auch bei mir löst er es manchmal nicht richtig auf, aber er kompiliert ja trotzdem.

bigmama2k 8. Mär 2007 20:23

Re: Problem bei Erstellung eigener Unit
 
ja weil er löst nicht manchmal korrekt auf...

er macht es mit der ganzen Unit von mir bzw. allen anderen Units wo ich erstelle und wenn
mal der ganze Source rot unterstrichen ist, dann ist das wirklich extrem störend.

mr2 8. Mär 2007 20:29

Re: Problem bei Erstellung eigener Unit
 
nimm' doch mal die Unit direkt in das Projekt auf (per Datei hinzufügen oder "drag and drop")

übrigens sind globale Variablen kein guter Programmierstil :wink:

das was Du gepostet hast, könntest Du alles mit class procedures / functions lösen, dann benötigst Du keine Instanzen

mr2

bigmama2k 8. Mär 2007 20:36

Re: Problem bei Erstellung eigener Unit
 
sorry ich fürchte ich kann dir gerade nicht ganz folgen

was meist du mit class procedure/functions?

Guido Eisenbeis 10. Mär 2007 04:14

Re: Problem bei Erstellung eigener Unit
 
Hallo bigmama.

Das kenne ich. Bei mir kam das zum Beispiel vor, wenn ich Units eingebunden habe die "sich überschneiden".

Zum Beispiel habe ich in einer eigenen Unit mit TBitmap gearbeitet. Zu diesem Zweck habe ich im interface-Abschnitt unter uses die Unit "Graphics" und im implemantation-Abschnitt unter uses die Unit "Windows" eingebunden.

Im interface-Abschnitt habe ich eine Funktion deklariet, die TBitmap benutzte.
Im implemantation-Abschnitt habe ich innerhalb einer Funktion mit TBitmap gearbeitet.

Beispiel:
Delphi-Quellcode:
procedure IrgendeineFunktion();
var
  BitMp: TBitmap;
begin
  BitMp := TBitmap.Create;
  ...
Dann hat Delphi heftig angefangen rot zu unterkringeln (zum Beispiel .Create) und hat die Sachen auch nicht mehr gekannt.

Versuch also mal, die Gültigkeitsbereiche der eingebundenen Units eindeutig festzulegen. Vielleicht bringt das Abhilfe.

Gruß,
Guido.

Chris P 10. Mär 2007 09:33

Re: Problem bei Erstellung eigener Unit
 
Zitat:

Zitat von bigmama2k
Delphi-Quellcode:
unit akcode;
  ...
 
  function TAKCode.GetUVersion; // <--- TAKCode.GetUVersion: string;
  begin
    Result :='1.1';
  end;

  ...
bigmama

Fehlt da nicht der Rückgabetyp?

Hawkeye219 10. Mär 2007 09:49

Re: Problem bei Erstellung eigener Unit
 
Hallo Chris,

die Sprachdefinition von PASCAL läßt es zu, die Parameterliste und den Ergebnistyp bei der Implementierung von Prozeduren und Funktion wegzulassen. Man kann darüber streiten, ob es sinnvoll ist.

Gruß Hawkeye

Chris P 10. Mär 2007 13:58

Re: Problem bei Erstellung eigener Unit
 
Ok, gut zu wissen ....

Ich habe gedacht, es wäre ein Syntaxfehler.

TonyR 10. Mär 2007 14:55

Re: Problem bei Erstellung eigener Unit
 
Manchmal hilft bei sowas schon, auf Typen, die irgendwo stehen mal per RechtsKLick auf "Deklaration suchen" zu gehen... dann hat der Editor wahrscheinlich erst richtig kapiert, dass es nichts zum Unterstreichen gibt... bei mir hats jedenfalls schon manchmal geholfen, aber keine Garantie, dass das bei dir auch so ist!

Guido Eisenbeis 10. Mär 2007 20:48

Re: Problem bei Erstellung eigener Unit
 
Zitat:

Zitat von Hawkeye219
Hallo Chris,

die Sprachdefinition von PASCAL läßt es zu, die Parameterliste und den Ergebnistyp bei der Implementierung von Prozeduren und Funktion wegzulassen. Man kann darüber streiten, ob es sinnvoll ist.

Gruß Hawkeye

Hier stimme ich Hawkeye zu. Es ist nicht immer sinnvoll, auch alles zu tun, was man tun kann! Ein Code wird einfach unübersichtlich und fehleranfällig, wenn man zum Beispiel Funktionen ohne explizite Angabe des Rückgabewertes deklariert. Ebenso erhöht auch einen leere Parameterliste die Lesbarkeit!

Ich selbst gehe auch öfter den bequemen Weg:

Delphi-Quellcode:
procedure IrgendeineFunktion();
var
  BitMp: TBitmap;
begin
  BitMp := TBitmap.Create;
  BitMp := Graphics.TBitmap.Create; // <- eigentlich besser
  ...
Aber solange es einem nicht alles rot unterkringelt ... :party:

Guido.


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