![]() |
Dynamische Programmierung 2 Fragen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Ich habe mir die Dynamische Programmierung genauer unter die Lupe genommen, soweit zu gut, leider habe ich 2 Fragen bzw. Probleme. Erstens möchte ich "SRKIBNewForm : TForm;", "SRKIBNewButton : TButton;", "SRKIBNewWebLabel : TLabel;" in eine PRIVATE deklaration auslagern, da sonst das keiner benutzen soll. Leider kommt dann immer ein Fehler beim erstellen. Zweitens habe ich ein Problem was das OnClick verhalten auf einen dynamisch erzeugten Button regelt (im TSRKInfoBox.TButtons.Create), ich habe es bereits in einer TYPE deklaration geschafft, jedoch funktioniert es bei mit nicht in einer verschachtelten deklaration. EDIT: Ich habe mal eine Testumgebung mit hochgeladen ist womit das ganze für euch vllt. einfacher ist...
Delphi-Quellcode:
MFG
unit uSRKInfoBox;
interface USES Windows, Graphics, StdCtrls, Forms, Controls, ShellApi; TYPE TSRKInfoBox = class PRIVATE TYPE TButtons = record PRIVATE PROCEDURE SetCaption(ACaption:String='Close'); FUNCTION GetCaption:String; PROCEDURE SetOnClick(Sender: TObject); PROCEDURE SetVisible(AVisible:Boolean=TRUE); FUNCTION GetVisible:Boolean; PUBLIC PROCEDURE Create; PROPERTY Caption:String READ GetCaption WRITE SetCaption; PROCEDURE Show; PROPERTY Visible:Boolean READ GetVisible WRITE SetVisible; END; PROCEDURE SetCaption(ACaption:String); PROCEDURE SetColor(Color:TColor); PROCEDURE SetHeight(AHeight:Integer); PROTECTED FFTButtons : TButtons; PUBLIC PROCEDURE Create; PROPERTY Caption:String WRITE SetCaption; PROPERTY Color:TColor WRITE SetColor; PROCEDURE Free; PROPERTY Height:Integer WRITE SetHeight; PROCEDURE Show; PROPERTY CloseButton:TButtons READ FFTButtons; END; VAR SRKIB:TSRKInfoBox; SRKIBNewForm : TForm; SRKIBNewButton : TButton; SRKIBNewWebLabel : TLabel; implementation PROCEDURE TSRKInfoBox.Create; BEGIN SRKIBNewForm := TForm.Create(Application.Owner); WITH SRKIBNewForm DO BEGIN BorderIcons := [biSystemMenu]; BorderStyle := bsToolWindow; Position := poDesktopCenter; END; END; PROCEDURE TSRKInfoBox.SetCaption(ACaption:String); BEGIN SRKIBNewForm.Caption := ACaption; END; PROCEDURE TSRKInfoBox.SetColor(Color:TColor); BEGIN SRKIBNewForm.Color := Color; END; PROCEDURE TSRKInfoBox.Free; BEGIN SRKIBNewForm.Free; END; PROCEDURE TSRKInfoBox.SetHeight(AHeight:Integer); BEGIN SRKIBNewForm.Height := AHeight; END; PROCEDURE TSRKInfoBox.Show; BEGIN SRKIBNewForm.Show; END; /////////////////////////////////////////////////////////////////////////// PROCEDURE TSRKInfoBox.TButtons.Create; BEGIN SRKIBNewButton := TButton.Create(SRKIBNewForm); SRKIBNewButton.Parent := SRKIBNewForm; //-------------------------------------------\\ SRKIBNewButton.OnClick := SRKIB.FFTButtons.SetOnClick; SRKIBNewButton.OnClick := SRKIB.TButtons.SetOnKlick; //-------------------------------------------\\ END; PROCEDURE TSRKInfoBox.TButtons.SetCaption(ACaption:String='Close'); BEGIN SRKIBNewButton.Caption := ACaption; END; FUNCTION TSRKInfoBox.TButtons.GetCaption:String; BEGIN result := SRKIBNewButton.Caption; END; PROCEDURE TSRKInfoBox.TButtons.SetOnClick(Sender: TObject); BEGIN SRKIBNewButton.Free; SRKIBNewForm.Free; END; PROCEDURE TSRKInfoBox.TButtons.SetVisible(AVisible:Boolean=TRUE); BEGIN SRKIBNewButton.Visible := AVisible; END; FUNCTION TSRKInfoBox.TButtons.GetVisible:Boolean; BEGIN result := SRKIBNewButton.Visible; END; PROCEDURE TSRKInfoBox.TButtons.Show; BEGIN SRKIBNewButton.Show; END; geskill PS: Das Dynamische Feld wird von einem Formular gestartet, wobei folgende Proceduren benutzt werden
Delphi-Quellcode:
SRKIB.Create;
SRKIB.Caption := 'AAA'; SRKIB.CloseButton.Create; SRKIB.CloseButton.Caption := 'a'; SRKIB.CloseButton.Show; SRKIB.Show; |
Re: Dynamische Programmierung 2 Fragen
uj, was machst du denn da? Entweder hab ich mich beim anschauen wegen der teilweise nicht vorhandenen einrückung vertran oder du hast einen Record der Methoden und private Member hat?
Zitat:
|
Re: Dynamische Programmierung 2 Fragen
Zum Beispiel wenn ich "VAR SRKIBNewButton : TButton;" in den PRIVATE Teil verlagere
Delphi-Quellcode:
Dann kommt ein Fehler "Access violation at address [...]". Ich habe jetzt nicht in ein Wörterbuch geschaut aber das müsste eine Zugriffsverletzung sein, wobei man falsch oder mehrfach auf die Variable zugreift, aber so genau weiß ich es auch nicht...
//[...]
TYPE TSRKInfoBox = class PRIVATE TYPE TButtons = record PRIVATE VAR SRKIBNewButton : TButton; PROCEDURE SetCaption(ACaption:String='Close'); FUNCTION GetCaption:String; //[...] MFG |
Re: Dynamische Programmierung 2 Fragen
an welcher Adresse kommt die Access Violation? Ich vermute fast das du vergessen hast die Instanz zu erzeugen.
|
Re: Dynamische Programmierung 2 Fragen
Zitat:
Zitat:
EDIT: Ich habe das mit der neuen Instanz hinbekommen :-D, dafür schon mal danke :thumb:
Delphi-Quellcode:
MFG
CLASS VAR SRKIBNewButton : TButton;
|
Re: Dynamische Programmierung 2 Fragen
Leider habe ich immer noch das weitere Problem
Zitat:
Delphi-Quellcode:
Ich habe schon alles mögliche versucht wie:
//[...]
TYPE TSRKInfoBox = class PRIVATE CLASS VAR SRKIBNewForm : TForm; CLASS VAR SRKIBNewButton : TButton; CLASS VAR SRKIBNewWebLabel : TLabel; TYPE TButtons = record PRIVATE PROCEDURE SetCaption(ACaption:String='Close'); FUNCTION GetCaption:String; PROCEDURE SetOnKlick(Sender: TObject); PROCEDURE SetVisible(AVisible:Boolean=TRUE); FUNCTION GetVisible:Boolean; PUBLIC PROCEDURE Create; PROPERTY Caption:String READ GetCaption WRITE SetCaption; PROCEDURE Show; PROPERTY Visible:Boolean READ GetVisible WRITE SetVisible; END; //[...] PROCEDURE TSRKInfoBox.TButtons.Create; BEGIN SRKIBNewButton := TButton.Create(SRKIBNewForm); SRKIBNewButton.Parent := SRKIBNewForm; SRKIBNewButton.OnClick := ??? END; //[...] PROCEDURE TSRKInfoBox.TButtons.SetOnKlick(Sender: TObject); BEGIN SRKIBNewButton.Free; SRKIBNewForm.Free; END; //[...]
Delphi-Quellcode:
SRKIBNewButton.OnClick := SRKIB.TButtons.SetOnKlick;
// Feld oder Methodenbezeichner erwartet
Delphi-Quellcode:
MFG
SRKIBNewButton.OnClick := SRKIB.FFTButtons.SetOnKlick;
// Access violation at address [...] -> in CLASS Funktioniert nicht :-( |
Re: Dynamische Programmierung 2 Fragen
jehu ^^
Problem gelöst ... Uns zwar mit einer "CLASS VAR Button : TButtons;" VAR leider nicht das Beste (geht bestimmt auch anders...) aber so gehts ...
Delphi-Quellcode:
TYPE TButtons = record
PRIVATE CLASS VAR Button : TButtons; PROCEDURE SetCaption(ACaption:String='Close'); FUNCTION GetCaption:String; PROCEDURE SetOnKlick(Sender: TObject); PROCEDURE SetVisible(AVisible:Boolean=TRUE); FUNCTION GetVisible:Boolean; PUBLIC PROCEDURE Create; PROPERTY Caption:String READ GetCaption WRITE SetCaption; PROCEDURE Show; PROPERTY Visible:Boolean READ GetVisible WRITE SetVisible; END;
Delphi-Quellcode:
SRKIBNewButton.OnClick := Button.SetOnKlick;
|
Re: Dynamische Programmierung 2 Fragen
Ich habe das Gefühl, dass du nicht wirklich weißt, was du wirklich machst. Zum einen ist die von SirThomberry schon angesprochene Ausrichtung und Formatierung schlecht bis gar nicht übersichtlich und zum anderen sind grundlegende Fehler enthalten. Ich würde dir vor allem erstmal ein OOP Tutorial empfehlen, schon allein wenn ich sehe, dass du eine Methode (!) namens Create angelegt hast. Auch würde ich gerne mal von dir hören, was denn die Angabe von "class" zu bedeuten hat - also mit deinen eigenen Worten...
|
Re: Dynamische Programmierung 2 Fragen
:shock: Alles in Großbuchstaben. Oje, kann es sein das du vorher in Basic programmiert hast?
|
Re: Dynamische Programmierung 2 Fragen
Zitat:
Zumeist ist die Basisadresse $40000 (oder so ähnlich). Wenn also eine Zugriffsverletzung beim Lesen oder schreiben in viel niedrigeren Regionen um die 0 stattfinden sieht man sofort ob ein Object instanziert wurde oder nicht. Und in deinem Fall wird versucht an Adresse 4 zu schreiben. Somit hast du wohl eine Instanz welche nil ist und greifst auf eine Variable zu welche an Offset 4 ist. :) |
Re: Dynamische Programmierung 2 Fragen
Ich finde es sehr lustig, was ihr hier meint über mich zu wissen, nur weil ich noch nicht so alt bin, und eine einfache frage gestellt habe, ach ja ich weiß was eine "Class" ist, ich habe informatikunterricht, und das gehört zu den grundlagen, in classen kann man proceduren/funktionen bündeln und ordnen, auf welche wiederum andere klassen nicht zugreifen können (wenn nicht gewollt), der vorteil an klassen ist der, das variablen, die in den classen erstellt werden, von allen proceduren/funktionen benutzt werden können. die eigenschaften wie public/private sind selbsterklärend, ich bin nicht doof und kann englisch. ausserdem die unordnung in dem code muss ich zugeben, was bis jetzt aber wieder behoben ist. und nein ich habe vorher nicht in visualbasic programmiert, nur angeschaut. die großbuchstaben schreibe ich, weil die (dass klingt vielleicht etwas dämlich) besser aussehen. das erste problem was ich erleutert habe ist mir bis jetzt nicht vorgekommen, in den "projekten" die ich bis jetzt durchnahm war das nie ein problem. naja ihr könnt ja denken was ihr wollt... von mir aus auch, dass ich nicht weiß was der unterschied zwischen string & integer ist :-) ^^ ...
Schönen Abend noch |
Re: Dynamische Programmierung 2 Fragen
Das, was du hast, ist aber keine Klasse! Das ist dir bewusst?
|
Re: Dynamische Programmierung 2 Fragen
Zitat:
Von daher die Frage: Ist dir bewusst was statische Variablen und Methoden besonderes haben in Bezug auf Member und "normale" Methoden? Ich habe mir dein Alter nicht angesehen, weil das spielt keine Rolle. Es gibt Leute die viel jünger sind und viel mehr Wissen haben als ich, von daher ist mir das Alter vollkommen egal. Zitat:
Zitat:
Zitat:
|
Re: Dynamische Programmierung 2 Fragen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 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