AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Multipage-Support: Ich komme nicht weiter

Ein Thema von hansklok · begonnen am 19. Aug 2007 · letzter Beitrag vom 26. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23   
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:21
Hallo,

ich bin grade dabei ein Grafik-Programm zu schreiben. Projekte, die in diesem Programm erstellt werden, können gespeichert und wieder geladen werden. Bis dahin kein Problem, aber ich möchte, dass ein "Dokument" mehrere "Seiten" beinhalten kann. Und hier komme ich einfach nicht weiter. Ich habe eine Klasse TSeite:

Delphi-Quellcode:
  TSeite = class(TList)
  private
      Width: Integer;
      Height: Integer;
      Objekt: Integer;
      Canvas: TCanvas;
      Offset: TBitmap;
      Raster: TRaster;
      Hintergrund: THintergrund;
      Information: TInformation;
  public
      ...
  end;
Eine TSeite kann verschiedene grafische Objekte (Textfelder, Ellipsen etc.) enthalten. Nun möchte ich eine Klasse "TDokument" schreiben, eigentlich müsste diese ja auch von Typ TList sein, denn sie enthält ja mehrere Seiten. Ich komme aber mit meinem Denkansatz nicht weiter. Wie kann ich in ein TDokument eine neue TSeite einfügen, wie kann ich im TDokument nur eine bestimmte Seiten ansprechen? Versteht ihr mein Problem? Ich würde mich freuen, wenn wir gemeinsam ein Grundgerüst für diese Klasse entwickeln könnten.

Viele Grüße hansklok
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:29
Zitat von hansklok:
... Nun möchte ich eine Klasse "TDokument" schreiben, eigentlich müsste diese ja auch von Typ TList sein, denn sie enthält ja mehrere Seiten. ...
TList ist der Unit Classes deklariert:
Delphi-Quellcode:
  TList = class(TObject)
  private
    FList: PPointerList;
    FCount: Integer;
    FCapacity: Integer;
  protected
    function Get(Index: Integer): Pointer;
    procedure Grow; virtual;
    procedure Put(Index: Integer; Item: Pointer);
    procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
    procedure SetCapacity(NewCapacity: Integer);
    procedure SetCount(NewCount: Integer);
  public
    destructor Destroy; override;
    function Add(Item: Pointer): Integer;
    procedure Clear; virtual;
    procedure Delete(Index: Integer);
    class procedure Error(const Msg: string; Data: Integer); overload; virtual;
    class procedure Error(Msg: PResStringRec; Data: Integer); overload;
    procedure Exchange(Index1, Index2: Integer);
    function Expand: TList;
    function Extract(Item: Pointer): Pointer;
    function First: Pointer;
    function GetEnumerator: TListEnumerator;
    function IndexOf(Item: Pointer): Integer;
    procedure Insert(Index: Integer; Item: Pointer);
    function Last: Pointer;
    procedure Move(CurIndex, NewIndex: Integer);
    function Remove(Item: Pointer): Integer;
    procedure Pack;
    procedure Sort(Compare: TListSortCompare);
    procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);
    property Capacity: Integer read FCapacity write SetCapacity;
    property Count: Integer read FCount write SetCount;
    property Items[Index: Integer]: Pointer read Get write Put; default;
    property List: PPointerList read FList;
  end;
Eventuell könnte man ein Array of TSeite verwenden.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:31
Ich werfe mal eine Delphi-Referenz durchsuchenTObjectList in den Raum. Damit ist das möglich, was Du vor hast (und spart das Array )
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:32
Entweder du baust dir deine eigene Listenklasse, oder du benutzt einfach TObjectList.

Delphi-Quellcode:
type
  TDokument = class
    Pages: TObjectList;
    //....
  end;

  //oder
  TDokument = class(TObjectList)
    //..
  end;
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:35
Zitat von Die Muhkuh:
... (und spart das Array )
Sieht auch eleganter aus.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:35
Hi,

ich würde ja diese Aufteilung vorschlagen:

Delphi-Quellcode:
type
  TSeite = class(TObject)
  ...
  end;

  TDokument = class(TObjectList)
  private
    function GetSeite(Index: Integer): TSeite;
  public
    property Items[Index: Integer]: TSeite read GetSeite;
  end;

function TDokument.GetSeite(Index: Integer): TSeite;
begin
  Result := TSeite(inherited Items[Index]);
end;
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#7

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:40
@ Die Muhkuh

Ich habe noch nie mit TObjectList gearbeitet, aber nach nächtlichen Dauer-Suchen hatte ich auch schon darüber nachgedacht, aber wie könnte ich z.B. eine neue Seite in das Dokument einfügen und es gilt ja auch zu beachten, dass wenn ein TDokument erstellt wird bereits eine Seite vorhanden sein soll!
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 14:44
Hi,

hinzufügen geht z.B. so:

Delphi-Quellcode:
// Dokument: TDokument (irgendwo erzeugen^^)
var
  Seite: TSeite;
begin
  Seite := TSeite.Create(<evtl. ein Owner);
  Dokument.Add(Seite);

  // Zugriff auf Seite 1 wäre z.B.
  Seite := Dokument.Items[0];
  // Hier kannst Du nun was mit der Seite anstellen
end;
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#9

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 16:16
So, ich habe mir schnell mal etwas zusammengebastelt (siehe Anhang). Ist der Aufbau so richtig und warum erscheint beim Schließen der Testanwendung die Fehlermeldung "Ungültige Zeigeroperation"?

@ Die Muhkuh:

Ich habe zwar schon von propertys gelsen/gehört, aber wie funktioniert das in Bezug auf meine Klasse bzw. welche Vorteile bringt mir das?

property Items[Index: Integer]: TSeite read GetSeite; ???? Für eure Hilfe wäre ich sehr dankbar!

MfG hansklok
Angehängte Dateien
Dateityp: rar test_120.rar (240,6 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Multipage-Support: Ich komme nicht weiter

  Alt 19. Aug 2007, 16:21
Hi,

Du brauchst die Seiten, die Du der ObjectList hinzufügst, nicht selbst wieder über Free zerstören, dass macht die ObjectList selbst. Dann gibst Du im Destructor von TDokument die Variable Offset frei (Offset.Free). Im OnDestroy der Form steht auch noch mal Offset.Free. Eins von beiden musst Du entfernen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf