Popup erstellen

Hmm... seltsam hab das nun gemacht

Aber nun bekomm ich diese meldung

[DCC Fehler] Metin2Markt.pas(60): E2035 Nicht genügend wirkliche Parameter
[DCC Fehler] Metin2Markt_.dpr(6): F2063 Verwendete Unit 'Metin2Markt.pas' kann nicht compiliert werden

Code:
unit Metin2Markt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, OleCtrls, SHDocVw, ComCtrls, ActnPopup;

type
  Tm2m = class(TForm)
    WebBrowser1: TWebBrowser;    // Webbrowser
    MainMenu1: TMainMenu;        // Menü
      Datei1: TMenuItem;         // Allgemeines zur Metin2Markt
        Eintragen1: TMenuItem;   // Neues Item eintragen
        Beenden1: TMenuItem;     // Programm beenden
      Info1: TMenuItem;          // Version und Autor hinweis
        Hinweis1: TMenuItem;     // Hinweis
      AdminCP1: TMenuItem;       // Nur Für AdminRechten
        AllEintrge1: TMenuItem;  // Alle einträge anzeigen
        Items1: TMenuItem;       // Neue Items Anzeigen und gegenenfalls Freischalten
        ItemsDel1: TMenuItem;    // Löschen bestimmter Items
    procedure FormCreate(Sender: TObject);
    procedure Eintragen1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Hinweis1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  m2m: Tm2m; //Das Allgemeine Form-Fenster

implementation

uses
  info_hinweis;

{$R *.dfm}

// Webseite im Frame anzeigen
procedure Tm2m.FormCreate(Sender: TObject);
begin
  Webbrowser1.Navigate('www.google.de');
end;

//Eintragen Button => Zum Eintragen eines neuen Items
procedure Tm2m.Eintragen1Click(Sender: TObject);
begin
  Webbrowser1.Navigate('www.google.de');
end;

//Hinweis zur Version und Autor des Programms im Popup
procedure Tm2m.Hinweis1Click(Sender: TObject);

var
    Info: TInfoHinweis1;
begin
  Info.Create; // Objekt wird erzeugt
  Info.ShowModal; // Formular wird angezeigt
end;

//Beenden des Programms
procedure Tm2m.Beenden1Click(Sender: TObject);
begin
  m2m.Close;
end;

end.

Irgendwie mach der das nicht so wirklich
 
Irgendwie mach der das nicht so wirklich
"Der" sind der Compiler und der Linker und solange du deren Meldungen binär verwendest (Fehlermeldung = Alles falsch, laut um Hilfe rufen; keine Fehlermeldung = alles richtig) wirst du auf lange Sicht keine ordentlichen Programme schreiben können und ziemlich viel Mist mit dem Speicher anstellen.
Der Compiler sagt dir nämlich ganz genau, was ihm nicht passt, man muss es nur auch einmal lesen:
[DCC Fehler] Metin2Markt.pas(60): E2035 Nicht genügend wirkliche Parameter
Metin2.Markt.pas, Zeile 60. Was steht denn das drin?
Code:
Info.Create; // Objekt wird erzeugt
Und was soll das jetzt heissen?
Genau das, was der Compiler sagt. Dein Programm versucht die Methode Create() aufzurufen und da fehlen noch irgendwelche Parameter. In deinem ganzen TInfoHinweis wirst du aber keine Methode namens Create() finden. Jetzt heisst es aber in jedem Buch zu Delphi, dass Delphi objekorientiert läuft. Das bedeutet auch, dass dein TInfoHinweis von einer anderen Klasse abgeleitet sein kann und von dieser Elternklasse das Create() geerbt haben kann.
Um was wetten wir, dass sich in deinem info_hinweis.pas folgende Zeile findet?
Code:
type
  TInfoHinweis = class(TForm)
Die bedeutet wieder nichts anderes, als dass dein TInfoHinweis von TForm abgeleitet ist. Du hast aber nie eine Klasse TForm angelegt. Da liegt der begründete Verdacht nahe, dass es sich bei TForm um eine Delphiklasse handelt.
Und das ist ein so typischer Fall, dass ich gar nicht anders kann, als zu sagen: RTFM!
Denn genau dafür sind offline Dokumentationen und Hilfssysteme da!
In der Borlandhilfe finden sich mit dem Stichwort "TForm" sofort mehrere Einträge die auch alle mehr oder weniger direkt auf die Seite mit der Beschreibung der TForm-Klasse führen. Und bei der befindet sich unter den Methodenbeschreibungen auch das hier:

TCustomForm.Create Konstruktor

Erzeugt und initialisiert ein neues TForm-Objekt.

Klasse
TCustomForm

Syntax


Code:
 constructor Create(AOwner: TComponent);


Beschreibung
Mit Create können Sie ein neues Objekt der Klasse TForm oder einer abgeleiteten Klasse von TForm zur Laufzeit instantiieren. Der Parameter AOwner gibt den Eigentümer des TCustomForm-Objekts an.
...

Alles zurückgespult...
...und schon sind wir wieder bei
Code:
Info.Create; // Objekt wird erzeugt
Die Hilfe sagt
Der Parameter AOwner gibt den Eigentümer des TCustomForm-Objekts an.
Du hast keinen Parameter. Der gleichen Meinung ist auch der Compiler:
E2035 Nicht genügend wirkliche Parameter

Und hier jetzt die Lösung:
Gib deinem Create einfach irgendein Objekt mit. Derzeit dürfte es für dich noch keine Rolle spielen, ob du wirklich den Owner oder sonst was übergibst. Am einfachsten dürfte es sein mit
Code:
Info.Create(self); // Objekt wird erzeugt

Und noch ein Tip am Rande:
Ich halte es für extrem unwahrscheinlich, dass du wirklich die Programmierung in Delphi lernen kannst ohne dass du
- wenigstens mal irgendein Handbuch zu Pascal und/oder Delphi gelesen hast
- auch wirklich Fehlermeldungen liest und versuchst, sie zu verstehen (auch bei Fehlermeldungen funktioniert F1)
- die Onlinehilfe von Delphi benutzt.
 
Hmm... jetzt compiliert er es zwar alles richtig...

Nur kommt dann beim Klick auf Info bzw. Hinweis...

Zugriffsverletzung

Gibt es eigentlich auch eine Etwas vereinfachte Variante wie man sowas machen kann wie man es ja bei vielen Programmen sieht wenn man auf Info [?] klickt und dann auf "Über Mozilla Firefox geht" ?

Oder gibt es da nur diese Variante

PS: Und ja ich bin da drin Anfänger... und ja ich habe mich auch schlau gemacht bevor ich gepostet hab was den der Fehlende Parameter sein könnte...

Habe aber dazu nix finden können Sorry
 
Ok, dann nochmal etwas deutlicher.
Die Stichworte für dich (zum Suchen) sind "dynamische Formularerstellung". Insofern ok, ohne die richtigen Stichworte kann das Suchen in der Hilfe etwas hart sein.

Die Zugriffverletzung kommt jetzt daher (davon ausgehend, dass du einfach nur meine Zeile 1:1 so abgetippt hast):
Dein TInfoHinweis (abgeleitet von TForm) ist eine Klasse, eine Art Template, eine Schablone. In deiner Clickfunktion ist Info ein Zeiger (ich stamme aus der C++-Ecke und kenne nur diese Begriffe wirklich auswendig, evtl. heissen die in Delphi anders) auf "irgendein Ding" vom Typ TInfoHinweis.
Zum Zeitpunkt der Funktion ist aber Info eben immer noch nur der Zeiger auf "irgendein Ding" vom Typ TInfoHinweis und mit so etwas wie "irgendein Ding" mögen Compiler, Debugger und Betriebssystem aber überhaupt nichts anfangen und sind auch zu 0% tolerant sondern meckern dich sofort an vom Feinsten.
Du musst also aus "irgendein Ding" ein "genau DAS DA-Ding" machen.

Dafür ist der Create-Befehl.

Nur hast du mit hoher Wahrscheinlichekeit eben 1:1 abgeschrieben und hast in deinem Code stehen:
Code:
Info.Create(self)
Info ist aber immer noch ein Zeiger auf "irgendein Ding", welcher der Compiler nicht kennt oder versteht. Was der Compiler aber versteht ist: Info ist von TInfoHinweis, er schaut nach und findet in der Definition von TInfoHinweis... kein Create. Aber die Klassendefinition von TInfoHinweis zeigt auf TForm und in TForm... jup, da gibt es den Create.
Also ist der Create theoretisch möglich. Praktisch aber ist und bleibt Info "irgendein Ding".
Um aus TInfo ein "genau DAS DA-Ding" zu machen brauchst du diesen Befehl:
Code:
Info := TInfoHinweis.Create(self);
Übersetzt heisst das, dass TInfo jetzt wieder auf etwas zeigt.
Auf was?
Also da wird erstmal TInfoHinweis genommen. Und das gibt es! Das ist etwas ganz Konkretes, mit dem Compiler und Computer etwas anfangen können.
Und der Befehl Create bewirkt im Prinzip nichts anderes, als dass von TInfoHinweis eine Art "Kopie" erstellt und im Speicher des Computer abgelegt wird.
Und wo liegt diese Kopie?
Genau darauf zeigt ab jetzt Info und wird so von einem "irgendein Ding" zu einem "genau DAS DA-Ding" vom Typ TInfoHinweis. Und schon sind alle zufrieden und es gibt keinen Zugriffsfehler mehr.

Nein, ich will dich mit diesem Post nicht verarschen, das ist vielmehr tatsächlich die Art und Weise, wie ich mir früher selbst das Prinzip der Klasseninstanziierung gemerkt habe.

Stichworte zum weiteren Suchen wären:
- Klassen und Objekte
- Instanzen bzw. Instaziierung
- Objektorientierung und Vererbung

P.S.: "irgendein Ding" wird dann später bekannt als "null pointer exception" bzw. nicht instaziiertes Objekt, das "genau DAS DA-Ding" ist dann später ein Zeiger auf eine Klasseninstanz. ;)

P.P.S.:
Gibt es eigentlich auch eine Etwas vereinfachte Variante wie man sowas machen kann wie man es ja bei vielen Programmen sieht wenn man auf Info [?] klickt und dann auf "Über Mozilla Firefox geht" ?
Für dich ist das vielleicht nur ein kleiner Klick, für dein Programm kann das zu Schwerarbeit ausufern. Und sobald man sich mal mit dem Prinzip der objektorientierten Programmierung auseinander gesetzt und angefreundet hat, ist es gar nicht mal mehr so schwer oder aufwändig. Ein "wasch mich, aber mach mich dabei nicht naß" ist eben einfach nicht möglich.
 
Zuletzt bearbeitet:
Achso...

Gut das mit dem Stichwort suchen da bin ich schon verzweifelt da er mir zwar was raus geschmissen hat nach was ich gesucht habe aber nicht das Ergniss gefunden welches ich benötigte...

Wenn ich die Suche mit den Richtigen Stichwort gesucht "hätte" dann wäre ich bestimmt schlauer wie ich es jetzt bei dir bin wofür ich euch so lobe das es euch gibt...

Ich werd da nochmal genauer suchen und deines beherzigen sowie auch zum teil übernehmen ;)

PS: Ja hab es 1:1 übernommen xD zumindestens das Create(self)

Ansonsten schreib ich meist alles selber... aber Delphi ist so Benutzer Freundlich das man da eigentlich kaum gross was machen muss ausser halt eben Zusatzfunktionen wie meine xD
 

Neue Beiträge

Zurück