Gemeinschafst projekt: rtf änliches komponente !

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Gemeinschafst projekt: rtf änliches komponente !

Beitrag von pluto »

Hallo,
heute bzw. gestern habe ich mal mit den möglichkeiten rumgespielt eine einige RTF änliche komponente zu schreiben also eine komponente wo ich formatieren text eingeben kann zur laufzeit vom user ! das heißt einen Text den ich verschiedne farben,fontstyles und soweiter machen kann !

Am anfang war ich der meinung das ich es alleine hinbekommen müste doch als ich dann angefangen habe und mein system eingebaut habe habe ich gemerkt das das makieren viel zu langsamm geht !

Deshalb wollte ich mal fragen ob wir darauß nicht ein gemeintschafst projekt machen könnten dann wird draus auch weniges etwas ! es geht nicht draum ein vorhandes format zu lesen(das soll erst später gemacht werden) sondern überhaupt die möglichkeit zu haben einen text formatier anzuzeigen !

nochmal formatieren Text heißt für mich:
Unterschiedliche Farben,style(fett, unterstriechen,...) die ausrichtung ! und soweiter.

Ich würde gerne wissen was ihr davon haltet !

also hier mein system was ich mir überlegt habe:
Jede buchstabe ich ein objekt, jedes objekt befindet sich eine eine TObjektlist!
ein objekt besteht aus:
TBrush - für den hintergrund
TPen - weiß ich noch nicht genau
TFont - für die schrift selbst
sel - ob makiert oder nicht
position, size:TPoint


beim makieren passiert jetzt folgendes: ich klicke ein objekt an wird eine procedure gestartet die ob den erstn vorkommen bis zum letezn alles makiert damit hätten wir den erffekt wie die "normal" makierung funktion ! einfügen und löschen an blieberiger stelle dürfte auch kein problem werrden dank der TObjektlist !

Evlt. lade ich mein ersten versuch später noch hoch (bei nachfrage).
was meint ihr zu meinem system? könnte das funktnieren ?
erst wollte ich eine TStringlist verwenden das hätte ich geklapt aber damit hätte ich mehr probleme beim zeichnen gehapt bzw. beim formatieren zeichnen !
MFG
Michael Springwald

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 »

Das ist viel zu uneffizient für jeden Buchstaben ein Objekt zu verbraten,
für jede Zeichenkette mit den selben Formateinstellungen schon eher ...

Heute früh hast noch nen Thread aufgemacht "Was ich mir in den Kopf gesetzt habe bekomm ich auch hin ..." was ist damit ?

Das ganze ist sicherlich ein recht nützliches Projekt und muss auch irgendwann von irgendwem angegangen werden aber z.Z. hab ich persönlich kienen bedarf daran und auch nicht die zeit mich grossartig damit zu beschäftigen.
Dateianhänge
QmwDocument.pas
(71.21 KiB) 100-mal heruntergeladen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von pluto »

Code: Alles auswählen

Heute früh hast noch nen Thread aufgemacht "Was ich mir in den Kopf gesetzt habe bekomm ich auch hin ..." was ist damit ?

das basierte auf die idee die ich obene geannt habe ! als ich gesehen habe das es nicht klapt so muste ich natürlich aufgeben bis ich mir was neues einfallen lasse !
Ich habe ja nicht gesagt wann ich es schaffe! nur das ich es schaffe es können dabei schon ein paar Jahre dauern !


Danke für die nuit ! werde ich mir genauer anschauen

Code: Alles auswählen

für jede Zeichenkette mit den selben Formateinstellungen schon eher ...

das habe ich mir auch schon überlegt und irgenjammnd meinte sogar als baum ! die frage ist wie soll das gehen ? dazu habe ich keine idee wie das gehen könnte !
MFG
Michael Springwald

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

Beitrag von pluto »

ich habe versucht die datei die du im anahng als in laazrus einzubinden als komponente !
aber irgenwie meckert der komplier hier:
/usr/lib/lazarus/lcl/fileutil.pas(124,2) Fatal: Can't open include file "filectrl.inc"

ich habe ein neue LPK datei erzeugt und die möchte ich komplieren ! verzeichnise einträge habe ch angepasst !
MFG
Michael Springwald

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

hätte ich das nötige knowhow würde ich mitmachen beim projekt^^ , also ich bitte dann schnell um ergebnisse :D

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 habe versucht die datei die du im anahng als in laazrus einzubinden als komponente !
aber irgenwie meckert der komplier hier:


Na und ? das is ja auch ne kylix geschichte die uses anweisung wirst du jawohl selbst auf lazarus umgestrickt bekommen oder ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von theo »

Christian hat geschrieben: QMwDocument.pas


Hast du mal damit was gemacht?
Ich hab's nicht so ganz kapiert.
Ausserdem gefällt mir nicht so, dass das Ganze ziemlich "Line" basiert ist

Die "Lines" in einem RichEditor sind für mein Verständnis eher beiläufige Eigenschaften des Text-Items bzw des Block-Elements, welche sich beim Wordwrapping auch ständig ändern können.
Ich würde die Sache anhand der klassischen MSWord Einheiten:
Seite - Absatz - Zeichen aufziehen. wobei letzeres auf einen Block von Zeichen gleichen Stils anzuwenden ist.

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 »

Hast du mal damit was gemacht?
Ich hab's nicht so ganz kapiert.
Ausserdem gefällt mir nicht so, dass das Ganze ziemlich "Line" basiert ist


Ne, hab ich mir mal vorgenommen gehabt das ist halt das was dem fall von dem was Pluto machen will am ehesten entspricht.
Hast schon recht Seite-Absatz-Zeichenkette ist schon sinvoll Wobei man Seite villeicht noch weiter verallgemeinern können sollte damit man auch Seitenlose Sachen machen kann ich denk da an Html Seiten oder Hilfen ...
So hätte man ein Universaltool was Readers und Writers für entsprechende Formate anbinden könnte so stell ich mir das jedenfalls vor ...
das MwDocument ist ja nur ein Ansatz um Lösungsansätze zu haben
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von theo »

Christian hat geschrieben: Wobei man Seite villeicht noch weiter verallgemeinern können sollte damit man auch Seitenlose Sachen machen kann ich denk da an Html Seiten oder Hilfen ...


Klar, aber so anders ist das bei HTML nicht.
Es gibt da halt nur eine Seite und diese hat keine fixen Dimensionen,
aber durchaus Eigenschaften wie z.B. Hintergrundfarbe, Ränder...

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 »

Joa, und jetzt wär schon weider n svn server schön da könnt man neben der disskussion gleich noch n klassengerüst aufbauen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von theo »

Christian hat geschrieben:Joa, und jetzt wär schon weider n svn server schön da könnt man neben der disskussion gleich noch n klassengerüst aufbauen


Das geht auch ohne SVN. Fang doch mal an! ;-)

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 »

Heut abend villeicht geht aber mit svn wesentlich komfortabler als hier an jeden beitrag ne geänderte version dranhängen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von theo »

Habe eben noch nen alten Versuch meinerseits hervorgekramt. Das Projekt hat aber nie das Tageslicht erblickt. Guckst Du hier:


Code: Alles auswählen

type
  PStartEnd = ^TStartEnd;
  TStartEnd = packed record
    Start: LongWord;
    Ende: LongWord;
  end;
 
 
 
  TWhitespaceType = (wtLineBreak, wtSoftLineBreak, wtSpacer);
 
  TRichAlign = (alLeft, alRight, alHCenter, alTop, alBottom, alVCenter);
 
  TListTypes = (ltNone, ltCircle, ltRect, ltEnum);
 
  TRichString = type string;
 
  PWordPoint = ^TWordPoint;
  TWordPoint = packed record
    StartChar: Word;
    EndChar: Word;
  end;
 
  TWrapInfo = record
    DrawingRect: TRect;
    WrapPos: TWordPoint; //Max 65535 characters per single item
  end;
 
 
  //Baseclass for document-source relation (HTML)
type
  TSourceItem = class
  private
    fSourceStartEnd: TStartEnd;
  public
    property SourceStartEnd: TStartEnd read fSourceStartEnd write fSourceStartEnd;
  end;
 
  TCustomRenderer = class;
 
  //A visible item: Text with same format, Images..
  TVisibleItem = class(TSourceItem)
  private
    fEditorLine: Word;
  protected
    function GetPosition: TPoint; virtual; abstract;
    procedure SetPosition(const Value: TPoint); virtual; abstract;
    function GetHeight: integer; virtual; abstract;
    function GetWidth: integer; virtual; abstract;
    procedure SetHeight(const Value: integer); virtual; abstract;
    procedure SetWidth(const Value: integer); virtual; abstract;
    function GetItemRect: TRect; virtual; abstract;
  public
    property Position: TPoint read GetPosition write SetPosition;
    property Width: integer read GetWidth write SetWidth;
    property Height: integer read GetHeight write SetHeight;
    property EditorLine: Word read fEditorLine write fEditorLine;
    property ItemRect: TRect read GetItemRect;
  end;
 
  TBlockItem = class(TVisibleItem)
  private
    fItemRect: TRect;
  protected
    function GetPosition: TPoint; override;
    procedure SetPosition(const Value: TPoint); override;
    function GetHeight: integer; override;
    function GetWidth: integer; override;
    procedure SetHeight(const Value: integer); override;
    procedure SetWidth(const Value: integer); override;
    function GetItemRect: TRect; override;
  end;
 
  TRichDrawingItem = class(TBlockItem)
  private
    fEditable: boolean;
  public
 
  end;
 
  //A Whitespace type
  TWhiteSpace = class(TSourceItem)
  private
    fType: TWhiteSpaceType;
  public
    property SpType: TWhiteSpaceType read fType write fType;
  end;
 
  TWrapInfoArr = array of TWrapInfo;
 
  //A part of the document text with the same font properties
  TTextItem = class(TVisibleItem)
  private
    fFont: TCachedFont; //Don't worry this is only a pointer
    fText: TRichString;
    fWrapPositions: TWrapInfoArr;
    fCurrentLine: Word; //Wrapped Lines
    function GetFont: TFont;
    procedure SetFont(const Value: TFont);
    function GetCachedFont: TCachedFont;
    procedure SetCachedFont(const Value: TCachedFont);
    procedure SetCurrentLine(const Value: Word);
    function GetWrappedText: TRichString;
    function GetWrappedLinesCount: Cardinal;
  protected
    function GetPosition: TPoint; override;
    procedure SetPosition(const Value: TPoint); override;
    function GetHeight: integer; override;
    function GetWidth: integer; override;
    procedure SetHeight(const Value: integer); override;
    procedure SetWidth(const Value: integer); override;
    function GetItemRect: TRect; override;
  public
    constructor Create;
    destructor Destroy; override;
    procedure ClearWrappedLines;
    property Text: TRichString read fText write fText;
    property CachedFont: TCachedFont read GetCachedFont write SetCachedFont;
    property Font: TFont read GetFont write SetFont;
    property CurrentLine: Word read fCurrentLine write SetCurrentLine;
    property WrappedText: TRichString read GetWrappedText;
    property WrappedLinesCount: Cardinal read GetWrappedLinesCount;
    property WrapPositions: TWrapInfoArr read fWrapPositions;
  end;
 
  //A paragraph, with the typical properties and holding it's VisibleItems
  TRichParagraph = class(TPersistent)
  private
    fItemsList: TList;
    fAlign: TRichAlign;
    fListType: TListTypes;
    fSpaceBefore: Word;
    fSpaceAfter: Word;
    fSpaceLeft: Word;
    fSpaceRight: Word;
    function Get(Index: Integer): TSourceItem;
  public
    constructor Create;
    destructor Destroy; override;
    property Align: TRichAlign read fAlign write fAlign;
    property ListType: TListTypes read fListType write fListType;
    procedure AddText(Text: TRichString; Font: TFont);
    procedure DeleteItem(Item: TSourceItem);
    procedure InsertText(index: integer; Text: TRichString; Font: TFont);
    procedure AddLineBreak;
    procedure AddSoftLineBreak;
    property SpaceBefore: Word read fSpaceBefore write fSpaceBefore;
    property SpaceAfter: Word read fSpaceAfter write fSpaceAfter;
    property SpaceLeft: Word read fSpaceLeft write fSpaceLeft;
    property SpaceRight: Word read fSpaceRight write fSpaceRight;
    property Items[Index: Integer]: TSourceItem read Get; default;
    property ItemsList: TList read fItemsList write fItemsList;
  end;
 
  //Holding all the Sheet information. Note: this in not a page, it's the general page setup.
  TRichSheetInfo = class(TPersistent)
  private
    fLeftBorder: integer;
    fRightBorder: integer;
    fTopBorder: integer;
    fBottomBorder: integer;
    fColor: TColor;
    fHeight: integer;
    fWidth: integer;
    fOpenHeight: boolean; //Like HTML
    function GetContentRect: TRect;
 
  public
    property LeftBorder: integer read fLeftBorder write fLeftBorder;
    property RightBorder: integer read fRightBorder write fRightBorder;
    property TopBorder: integer read fTopBorder write fTopBorder;
    property BottomBorder: integer read fBottomBorder write fBottomBorder;
    property Width: integer read fWidth write fWidth;
    property Height: integer read fHeight write fHeight;
    property Color: TColor read fColor write fColor;
    property ContentRect: TRect read GetContentRect;
  end;
 
  //The Paragraphs List holder and renderer.
  TRichDocument = class(TPersistent)
  private
    fParagraphsList: TList;
    fSheetInfo: TRichSheetInfo;
    fRenderer: TCustomRenderer;
    function Get(Index: Integer): TRichParagraph;
 
  protected
 
 
  public
    constructor Create;
    destructor Destroy; override;
    function AddParagraph: TRichParagraph;
    procedure Render;
    function ItemFromSheetCoords(X, Y: integer): TVisibleItem; overload;
    function ItemFromSheetCoords(X, Y: integer; var Paragraph: TRichParagraph): TVisibleItem; overload;
    function ParagraphFromItem(Item: TVisibleItem): TRichParagraph;
    property ParagraphsList: TList read fParagraphsList write fParagraphsList;
    property SheetInfo: TRichSheetInfo read fSheetInfo write fSheetInfo;
    property Paragraphs[Index: Integer]: TRichParagraph read Get; default;
    property Renderer: TCustomRenderer read fRenderer write fRenderer;
  published
 
  end;
 
  TCustomRenderer = class
  private
    fDoc: TRichDocument;
    fContentHeight: cardinal;
    fWordWrap: Boolean;
  public
    procedure Render; virtual; abstract;
    property Document: TRichDocument read fDoc write fDoc;
    property ContentHeight: cardinal read fContentHeight write fContentHeight;
    property Wordwrap: Boolean read fWordWrap write fWordWrap;
  end;
 
  TDefaultRenderer = class(TCustomRenderer)
  protected
    procedure AdjustLine(Para: TRichParagraph; ItemIdx, EditorLine: cardinal;
      MaxAscent: Integer; ContentWidth: cardinal);
  public
    procedure Render; override;
    constructor Create;
 
  end;
 
function WordPoint(StartChar, EndChar: Word): TWordPoint;
 
implementation

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

Beitrag von pluto »

sieht ja garnicht mal so schlecht aus ! ich habe jetzt mal die deine idee aufgrieffen Christian mit dem optimieren der objekte !
das problem ist/war immer das ich an den gezeichneten text auch wieder ran wollte ! ich werde noch einen 2. versuch machen:
ich habe jetzt eine objektliste in der TStringlisten drin sind und zwar pro schrift konfig eine ! das makieren dürfte(wenn ich glück habe) so funktnieren wie ich es mir vorgestellt habe

achja evlt. könnten wir ja unser eiges forum haben dort könnten wir dann alles weiter besprechen ! gleich ein SF projekt anzumelden halte ich ncoh viel zu fürh oder ? erst sollten wir was handfesten haben ! und ich denke das währe in einem exra forum besser aufgehaben also eine eigene benuterzgruppe ! wo alles rein kommt was mit dieem thema zu tuen hat !
MFG
Michael Springwald

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 »

schiess ma nicht mir kanonen auf spatzen wozu ein extra forum für eine kleine komponente ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten