Klasse aus einer Datei laden ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Danke für deinen Vorschalg bringt leider nicht den gewünschten erfolg:

Code: Alles auswählen

function TmyList.AddObj(toolindex:String;var inserindex:Integer;objlist:TObjectList = nil):TPaint2Object;
var
  paint2obj:TPaint2Object;
  index:Integer;
  AClass:TPaint2Object;
  AControl:TControl;
begin
  fvt.Clear;
  if (oldItemindex > -1) and (AktivDocument.objlist.count > 0 ) and (oldItemindex <=AktivDocument.objlist.Count-1) then begin
    TPaint2BasesObj(AktivDocument.objlist[oldItemindex]).isfocus:=false;
  end;
  fBuffer.Canvas.Brush.color:=clBlue; paint2obj:=nil;
  paint2obj:=nil;
  paint2obj:=TPaint2Object(FindClass(toolindex));
 
  if paint2obj <> nil then Writeln('= NIL -- !!');
  writeln(paint2obj.ClassName);
  if AClass <> nil then paint2obj:=AClass.Create(fBuffer);
 
  if toolindex <> 'tImageListB' then begin
    if paint2obj <> NIL then begin
 
      if objlist = nil then begin
        writeln(AControl.ClassName);
        AktivDocument.objlist.Add(TPaint2Object( paint2obj));
        index:=Documentlist[documentindex].objlist.Count-1;
        result:=TPaint2Object(AktivDocument.objlist[index]);
      end
      else begin
        if inserindex = -1 then begin
          objlist.Add(TPaint2Object( paint2obj));
          index:=objlist.Count-1;
        end
        else begin
          if inserindex < objlist.count-1 then begin
            objlist.Items[inserindex]:=TPaint2Object( paint2obj);
            index:=inserindex+1;
          end
          else begin
            objlist.Add(TPaint2Object( paint2obj));
            index:=objlist.Count-1;
          end;
        end;
        inserindex:=index;
        result:=TPaint2Object(objlist.items[index]);
      end;
 
    end
    else
      result:=nil;
  end
  else begin
    usrListBox.Items.AddObject(paint2obj.Name,tImageListB(TPaint2Object(AControl)));
    result:=TPaint2Object(usrListBox.Items.Objects[usrListBox.items.Count-1]);
  end;
 
  if Documentindex > -1 then
    AktivDocument.isMod:=true;
 
end; // AddOb

sobald ich jetzt auf paint2Obj zugreife gibt es eine AV obwohl es <> NIL ist.....

ich habe schon im Internet gesucht und auch was gefunden z.b. das ich den haupt Constructor als virtual defnieren muss das habe ich getan und alle abgeleiteten constructoren habe ich mit override gekennzeichnet
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

egal was ich versuche es geht einfach nicht es kommt immer eine AV
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:egal was ich versuche es geht einfach nicht es kommt immer eine AV


Du musst nen Typen:
class of TPaintObject definieren.

Schau dir mal meine opbitmapformats.pas an.
Dort habe ich was ähnliches gemacht.


Code: Alles auswählen

type TOpBmpClass = class of TCanvasOPBitmap;
 
....
 
procedure TOPPicture.LoadFromStream(Stream: TStream; Mime: string);
var cls: TOpBmpClass;
begin
  if Mime = '' then
    cls := GetClassFromMimeStream(Stream) else
  begin
    cls := GetClassFromMime(Mime);
    fLastMime := Mime;
  end;
  if cls <> nil then
  begin
    if fCurrentFormat <> nil then FreeAndNil(fCurrentFormat);
    fCurrentFormat := cls.create;
    Stream.Position := 0;
    (fCurrentFormat as cls).LoadFromStream(Stream);
    fMimeType := fLastMime;
  end else raise EPasBitMapError.Create('Stream Format not supported');
end;

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Verstehe ich leider nicht !

ich habe doch schon ein TPaintObject Defniert und zwar in einer anderen unit.....

dein beispiel verstehe ich leider auch nicht so recht :(
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Verstehe ich leider nicht (


Tja, was wollen wir jetzt machen?
Das nennt sich "Klassenreferenztypen". Vielleicht Googelst du mal ein bisschen.
z.B. hier: http://entwickler-forum.de/archive/inde ... 31277.html

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

danke für den link !
gesucht habe ich schon stunden lang danach, aber nichts passendes gefunden was mir weiter helfen könnte *schnif*. Aber jetzt habe ich ja ein neuen Anhaltspunkt Vielen Dank dafür !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

naja erhlich gesagt ist das beispiel nicht das was ich suche:

Code: Alles auswählen

type TControlClass = class of TControl;
 
function CreateControl(ControlClass: TControlClass;
const ControlName: string; X, Y, W, H: Integer): TControl;
begin
Result := ControlClass.Create(MainForm);
with Result do
begin
Parent := MainForm;
Name := ControlName;
SetBounds(X, Y, W, H);
Visible := True;
end;
end;


der erste Parameter müsste ein String sein, dann währe das was....

z.b. wird sie ja jetzt so aufgerufen:
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);

aber ich brauche sowas:
CreateControl('TEdit', 'Edit1', 10, 10, 100, 20);
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ich guck gleich mal, ich hab sowas für nen Formular-Manager mal gebastelt, da ist ein Trick drin wie man das machen kann.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Danke, das ist nett !
ich hoffe ihr könnt euch das vorstellen wie ich mir das vorstelle !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Dann guck dir das hier mal aufmerksam an. Das ist schon ziemlich ausgefuchst... :wink:
Dateianhänge
form-manager.zip
Formular-Manager für Delphi/Kylix, ist aber leicht auf FPC/Lazarus zu ändern.
(5.86 KiB) 44-mal heruntergeladen
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7179
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Danke für deinen Quellcode
hast einen intresannten Style für Quellcodes*G*
also ich würde sagen die DoAddNewForm
ist die entscheidende Funktion.
Genau bin ich noch nicht dahinter gekommen, aber das kommt bestimmt noch !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Wieso interessanter Style?... :shock:

Im Grunde wird ein Hilfsobjekt (TFormDescriptor) verwendet um ein beliebiges Formular zu erzeugen und in die Liste einzutragen. Zusätzlich haben alle Objekte ein Property .ClassType und .ClassName. Die kann man verwenden um auch ein entsprechendes Objekt zu erzeugen.
Also sozusagen von Hinten durch die Brust ins Auge.

#Edit

Um das zu benutzen muß der Formular-Manager per uses in die entsprechenden Units eingetragen werden. Dort kann man dann an der Stelle wo das Formular erzeugt werden soll kurz und Trocken:

Code: Alles auswählen

procedure TMyObjekt.CreateThisForm;
var
  AFormDesc: TFormDescriptor;
begin
  AFormDesc:= TFormDescriptor.Create;
  AFormDesc.FormClass:= TMyForm;
  AFormDesc.FormOwner:= Self;
  FMyForm:= FormManager.DoAddNewForm(AFormDesc, 'Meine Formularinfo');
  if FMyForm <> nil then begin
     // hier können noch weitere Einstellungen vorgenommen werden
     // oder die Event-Prozeduren eingehängt werden
     // wenn das Formular nicht alleine gestartet wird, kann das hier gemacht werden
  end;
end;


Der tiefere Sinn der Übung liegt darin, das man nun auf einfache Weise alle aktiven Formulare in der Anwendung als Liste hat und diese im Zweifel in einem Dialog anzeigen lassen kann (könnte noch im FormManager eingebaut werden) und dann gezielt auf ein bestimmtes Formular zugreifen kann und dieses in den Vordergrund holt. Genausogut könnte man auch gezielt bestimmte Formulare deinstallieren.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

@pluto

Übertragen auf dein Problem könntest du dir eine Wurzel-Klasse für deine Objekte bauen. Im FormManager ist das TFormClass. Die Wurzel-Klasse sollte alle gleichen Propertys der Nachfolgeklassen enthalten. Dann baust du dir einfach einen ähnlichen Manager bei dem du dann eben auch per Text festlegen kannst welche Klasse produziert werden soll (TWurzelKlasse := TMeineKlasse) und kannst dann vom Manager deine Klasse erzeugen lassen und in den Owner (Äquivalent FormOwner -> MyClassOwner) einhängen.

Alle weiteren Einstellungen nimmt man dann nach der Erzeugung vor.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Anmerkung!

Der FormManager ist noch nicht ganz fertig, den wollte ich noch ausbauen und würde mich deshalb freuen, wenn ihr mir Änderungen für das Ding mitteilen würdet oder mir sagt, was ihr da noch haben möchtet.

Insoweit stelle ich den jetzt mal unter LGPL.

Da der als eigenständige Komponente konzipiert ist, wäre es auch denkbar den dem Lazarus-Projekt z.V. zu stellen. Der könnte als zentrale Verwaltungsstelle für eine Anwendung nützliche Dienste leisten. Z.B. könnte man da noch ein Log-Objekt einbauen und dafür sorgen, das die Aufrufe von Formularen und die aufrufenden User protokolliert werden.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich verstehe den Sinn dieses Formularmanagers nicht in Application.Forms hast du doch einen komplette Liste aller Formulare.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten