Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein Programm ohne Units schreiben (https://www.delphipraxis.net/57645-ein-programm-ohne-units-schreiben.html)

Christian18 24. Nov 2005 15:35


Ein Programm ohne Units schreiben
 
Hallo,

wie kann ich ein Programm ohne Units schreiben. Ich soll ein Programm schreiben in der keine Units vorhanden sein sollen. Ich soll in der Datei Programmieren, in der normalerweise die Form created werden. Ist das überhaupt möglich??? wie kann ich da zum beispiel eine klasse TFenster erzeugen die mir dann ein grafisches fenster ausgibt???

MFG Christian18

Ultimator 24. Nov 2005 15:39

Re: Ein Programm ohne Units schreiben
 
Ohne Units? :shock:
Dann entweder Hier im Forum suchennonVCL oder eben sämtlichen Code aus den benötigten Units (Classes, StdCtrls etc.) in deine Projektdatei kopieren (fast unmöglich) und geht nur mit Versionen >= Professional.

RavenIV 24. Nov 2005 15:41

Re: Ein Programm ohne Units schreiben
 
hierbei handelt es sich um die dpr-Datei.
auch diese kannst du mit Delphi editieren und anschliessend compilieren.

schau dir den Inhalt einfach mal an, du wirst den "Trick" schon selber finden...

dahead 24. Nov 2005 15:42

Re: Ein Programm ohne Units schreiben
 
meinst du evtl. eine Konsolen Anwendung (Console Application) für die Eingabe-Aufforderung?

Nils_13 24. Nov 2005 15:48

Re: Ein Programm ohne Units schreiben
 
F8 drücken und dann hast du das was du haben willst, das ist das eigentliche programm, da kannst du Coden was du willst, ist halt komplizierter ... .

ichbins 24. Nov 2005 15:48

Re: Ein Programm ohne Units schreiben
 
Um den Projektquelltext zu bearbeiten, klickst du auf projekt -> quelltext anzeigen oder auf ansicht -> projektquelltext (je nach Delphiversion).

Du meinst sicher ohne selbstgemachte Units programmieren. Ein paar Units wirst du immer brauchen. Komplett ohne Units weiss der Compilier z.B. nicht, was inttostr heissen soll oder was eine tform ist. Diese Units stehen in der Uses-Liste. In der Unit WINDOWS.DCU sind eigentlich schon fast alle Befehle enthalten, um ein Konsolen- oder nonVCL-Programm zu schreiben. In der Unit forms ist tform deklariert. Classes enthält einige nützliche Typen. Ein normales Delphi-Programm enthält schon von Start an diese Units:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
zusätzlich enthält es noch die Unit unit1.pas.

faux 24. Nov 2005 15:54

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von Nils_13
F8 drücken und dann hast du das was du haben willst, das ist das eigentliche programm, da kannst du Coden was du willst, ist halt komplizierter ... .

F8 ist zum Debuggen gedacht. Damit kannst du eine gesamte Routine Debuggen, keine Ahnung was man hier Code will?!

Christian18 24. Nov 2005 16:05

Re: Ein Programm ohne Units schreiben
 
Hallo,

erst einmal danke für die schnellen antworten. ich habe jetzt mal probiert. das mache ich jetzt in meiner Projektdatei:

Delphi-Quellcode:
program Project1;

uses
  Forms;

type
  TFenster = class(TForm)
  private

  public

  end;

var
  Fenster : TFenster;

{$R *.res}

end.
bis jetzt geht aber noch kein fenster auf. was muß ich jetzt machen, damit ein fenster beim programm start geöffnet wird.

ichbins 24. Nov 2005 16:11

Re: Ein Programm ohne Units schreiben
 
Das geht eben nicht. Das mit den Fenstern liegt an der VCL von Delphi. Und die kann das eben nicht dierekt aus dem Projektquelltext auslesen dass du ein Fenster aufmachen willst. Dierekt aus dem Projektquelltext werden normalerweise nur nonVCL-Programme erstellt und das ist eine FURCHTBAR komplizierte Sache. Desweiteren könntest du auch eine Konsolenanwendung erstellen:
Delphi-Quellcode:
program project1;

uses
  windows;

var
  s:string;

begin
  allocconsole;
  writeln('Ich bin eine Konsolenanwendung. Drücken sie ENTER, um mich zu beenden.');
  read(s);
  freeconsole;
end;

igel457 24. Nov 2005 16:14

Re: Ein Programm ohne Units schreiben
 
das geht doch und zwar so:
Delphi-Quellcode:
program Project1;

uses
  Forms;

type
  TFenster = class(TForm)
  private

  public

  end;

var
  Fenster : TFenster;

{$R *.res}

procedure Button1Click(sender:TObject);
begin
  application.terminate;
end;

begin
  application.initalize;
  application.titel := 'Mein erstes Programm mit Fenster!';
  application.createform(TFenster,fenster);
  application.run;
  fenster.caption := 'Hallo';
  with tbutton.create(fenster) do
  begin
    parent := fenster;
    width := 100;
    caption := 'Klickmich!';
    onclick := Button1Click;
  end;
end.

ichbins 24. Nov 2005 16:19

Re: Ein Programm ohne Units schreiben
 
@igel: :shock:

application.run ist eine Endlosschleife. Es wird erst in die nächste Zeile gesprungen wenn der User das Programm beendet hat!

Form zur Laufzeit anzeigen geht so:

Delphi-Quellcode:
program Project1;

uses
  Forms;


type
  TFenster = class(TForm)
  {private

  public}   //brauchst du garnicht.

  end;

var
  Fenster : TFenster;

procedure Button1Click(sender:TObject);
begin
  application.terminate;
end;

{$R *.res}  //wenn du diese Zeile entfernst, verliert das Programm sein Icon.

begin
  Application.Initialize;
  Application.CreateForm(tfenster, fenster);
  fenster.caption := 'Hallo';
  application.title:='Mein erstes Programm mit Fenster'
  with tbutton.create(fenster) do
  begin
    parent := fenster;
    width := 100;
    caption := 'Klickmich!';
    onclick := Button1Click;
  end;
  Application.Run;
end.

Christian18 24. Nov 2005 16:24

Re: Ein Programm ohne Units schreiben
 
hallo ichbins,

wenn ich deine variante compilieren will, dann kommt bei mir eine fehler meldung. das hatte ich nämlich auch schon mal getestet. und bei mir kam genau die gleiche fehler meldung. so und hier jetzt die fehler meldung:

Exception EResNotFound in Modul Projekt1.exe bei 00043A94.
Ressource TFenster wurde nicht gefunden.

igel457 24. Nov 2005 16:27

Re: Ein Programm ohne Units schreiben
 
@ichbins :?

Zitat:

Zitat von Delphi-Hilfe
Mit CreateForm wird ein neues Formular des Typs erstellt, der im Parameter FormClass angegeben ist. Das Formular wird dann der Variablen zugewiesen, die der Parameter Reference bezeichnet. Der Eigentümer des neuen Formulars ist des Anwendungsobjekt.


Zitat:

Zitat von ichbins
application.run ist eine Endlosschleife! Es wird erst in die nächste Zeile gesprungen wenn der User das Programm beendet hat!...

Na gut, dann verschiebe das mit meinem Button halt eine Zeile weiter nach oben... :zwinker:

Delphi-Quellcode:
.
.
.
fenster.caption := 'Hallo';
with tbutton.create(fenster) do
begin
  parent := fenster;
  width := 100;
  caption := 'Klickmich!';
  onclick := Button1Click;
end;
application.run;
.
.
.
@christian18

Delphi schreibt normalerweise automatisch in die Resourcen-Datei Resourcen für die Fenster. Da du die aber nicht erstellt hast musst du das {*.res} da wohl weg lassen

Christian18 24. Nov 2005 16:32

Re: Ein Programm ohne Units schreiben
 
hallo igel,

ich habe das jetzt auch schon weggelassen und der gleiche fehler kommt immernoch.

ichbins 24. Nov 2005 16:34

Re: Ein Programm ohne Units schreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir kommen da jede Menge Fehlermeldungen.

für den Button brauche ich
Delphi-Quellcode:
stdctrls;
Resnotfound heisst dass er irgendeine Ressourcendatei nicht gefunden hat. Damit meint er wahrscheinlich die dfm-Datei...

gut gemeinter Rat: vergisses

Du kannst dein Fenster ganz ohne die Forms.pas erzeugen. Das geht dann über nonVCL. da schreibst du dir dann praktisch alle Teile der forms selber. Du hast auch keine application-variable etc... Dafür ist die Datei (mit D7) nur 14 KB groß.

Im Anhang mein erster/(noch) einziger nonVCL-Versuch. Das Programm kann seine Größe ausgeben und wenn ich auf das Form klicke, verschwindet der Text (eigentlich hätte was ganz anderes passieren sollen :oops:)

@igel: sry... :oops: ich hab deinen Code nur überflogen und dabei ein paar wichtige Dinge übersehen :oops:

igel457 24. Nov 2005 16:41

Re: Ein Programm ohne Units schreiben
 
Also wenn das alles nichts hilft, ein letzter Versuch von mir:
Delphi-Quellcode:
.
.
.
begin
  application.initialize;
  fenster := TFenster.Create(application);
  fenster.show;
.
.
.
  application.run;
end;
Delphi Denkt wenn du application.createform verwendest das du eine *.dfm Datei hättest.

@ichbins
entschuldigung akzeptiert :-D

Christian18 24. Nov 2005 16:41

Re: Ein Programm ohne Units schreiben
 
aber es muß doch auch eine andere möglichkeit geben. gibt es in allen andern programmiersprachen auch. man hat mir das ja auch als aufgabe gegeben. also muss es funktionieren. nonVCL hatte ich auch schon gedacht als ich die aufgabe bekam. dann habe ich die person angesprochen von der ich die aufbabe habe und dann sagte er das es auch anders funktioniert. er meinte ich soll eine Objektvariable aus anlegen und die dann aus der klasse TForm füllen. und das habe ich jetzt auch schon gemacht. und jetzt komme ich nicht weiter. naja wenn nochjemand was weiß, dann bitte ich um hilfe. vielen danke schon einmal im vorraus.

MFG Christian18

alzaimar 24. Nov 2005 17:59

Re: Ein Programm ohne Units schreiben
 
Du benötigst eigentlich nur die Windows-API, um Fenster zu erzeugen. In den Zeiten *vor* Delphi war das die einzige Möglichkeit, Windows-Applikationen zu entwickeln. Na, fast jedenfalls. Man bricht sich tierisch einen ab, aber es geht.

Ganz *ohne* Units geht es aber nicht, denn die Windows-API ist auch eine Unit, nur in Form einer DLL. Ohne fremde Hilfe (sprich: Units) kannst Du in Delphi und den meisten Programmiersprachen gar nichts anstellen, ausgenommen, im Stillen vor sich hinrechnen, da die Ein- und Ausgaberoutinen auch in einer Unit enthalten sind...

Du kannst Deinem Lehrer also spitzfindig erklären, das die Sprache 'Delphi' keine Sprachkonstrukte zum erzeugen von Fenstern beinhaltet, weswegen die Aufgabe per se nicht lösbar ist.

NicoDE 24. Nov 2005 18:10

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von Christian18
wie kann ich ein Programm ohne Units schreiben.

Definiere 'ohne Units'.
Soll das heißen 'ohne eigene Units', oder 'gänzlich ohne Units' (letzteres geht nicht, da der Delphi-Compiler ohne System.pas und SysInit.pas nicht arbeiten kann).

Christian18 24. Nov 2005 18:27

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Christian18
wie kann ich ein Programm ohne Units schreiben.

Definiere 'ohne Units'.
Soll das heißen 'ohne eigene Units', oder 'gänzlich ohne Units' (letzteres geht nicht, da der Delphi-Compiler ohne System.pas und SysInit.pas nicht arbeiten kann).

ja ich meine ohne eigene units.

Ralf Kaiser 24. Nov 2005 19:30

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von Christian18
hallo ichbins,

wenn ich deine variante compilieren will, dann kommt bei mir eine fehler meldung. das hatte ich nämlich auch schon mal getestet. und bei mir kam genau die gleiche fehler meldung. so und hier jetzt die fehler meldung:

Exception EResNotFound in Modul Projekt1.exe bei 00043A94.
Ressource TFenster wurde nicht gefunden.

Halli Hallo,

diese Variante benutzte "Application.CreateForm()". Dabei wird dann versucht die entsprechende Fenster-Resource aus der DFM-Datei zu laden. Diese DFM-Datei war aber nicht vorhanden.

Erzeuge das Fenster mit:

Fenster := TFenster.Create(Application);

und dann sollte es gehen.

Ralf Kaiser 24. Nov 2005 19:33

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von Christian18
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Christian18
wie kann ich ein Programm ohne Units schreiben.

Definiere 'ohne Units'.
Soll das heißen 'ohne eigene Units', oder 'gänzlich ohne Units' (letzteres geht nicht, da der Delphi-Compiler ohne System.pas und SysInit.pas nicht arbeiten kann).

ja ich meine ohne eigene units.

Und was soll das bringen? Soll das "one Units" nur zu Übungszwecken gemacht werden oder hat es einen speziellen Sinn??

Ciao,
Ralf

Ralf Kaiser 24. Nov 2005 19:40

Re: Ein Programm ohne Units schreiben
 
Zitat:

Zitat von igel457
das geht doch und zwar so:
Delphi-Quellcode:

procedure Button1Click(sender:TObject);
begin
  application.terminate;
end;

begin
  application.initalize;
  application.titel := 'Mein erstes Programm mit Fenster!';
  application.createform(TFenster,fenster);
  application.run;
  fenster.caption := 'Hallo';
  with tbutton.create(fenster) do
  begin
    parent := fenster;
    width := 100;
    caption := 'Klickmich!';
    onclick := Button1Click;
  end;
end.

Hallo,

das wird so nicht gehen. (ich meine jetzt nicht das mit dem CreateForm, das geht auch nicht aber das wurde hier ja schon behandelt)

Was auch nicht geht ist die Zuweisung des Eventhandlers "Button1Click". Dieser ist als ganz normale Prozedur deklariert. Als Eventhandler können aber nur Methoden benutzt werden!

Es muss also heissen:

Delphi-Quellcode:
procedure TFenster.Button1Click(sender:TObject);
begin
  application.terminate;
end;
und später dann:

Delphi-Quellcode:
onclick := TFenster.Button1Click;
Ohne "Button1Click" zu einer Methode zu machen, bekommst du diesen Source ja nicht einmal kompilliert.

Ciao,
Ralf

igel457 24. Nov 2005 19:43

Re: Ein Programm ohne Units schreiben
 
Stimmt, hatte ich vergessen...
Ich frage mich aber, weshalb das auch ohne das "application.createform" nicht funktionert...

malo 24. Nov 2005 19:52

Re: Ein Programm ohne Units schreiben
 
Versuch doch auch mal Luckies Win32-API Tutorial ;)

Hat mir ein wenig geholfen. Auch wenn ich im Endeffekt Fenster mit der Win32-API erstmal links liegen lassen will, und mich nur auf die Messages beschränken will, wenn ich das mal brauchen sollte... Mich damit noch rumzuärgern lohnt imho kaum. Da warte ich lieber, bis .NET Standard ist. Da spart man sich das Umgewöhnen ;)

NicoDE 25. Nov 2005 11:22

Re: Ein Programm ohne Units schreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein "Hello World"-Projekt "ohne Units"...

- Delphi gestartet
- Neu / Anwendung ...
- Button auf Form erzeugt
- Button1Click implementiert
- Alles gespeichert
- Delphi geschlossen
- Unit1.dfm -> Projekt1.dfm
- Projekt1.dpr uses aus Unit1.pas
- Code aus Unit1.pas in Projekt1.dpr
- Delphi gestartet
- Projekt erzeugt


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