AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Diverse Komponenten: SVGImage, Adv. Memo, PaletteForm
Thema durchsuchen
Ansicht
Themen-Optionen

Diverse Komponenten: SVGImage, Adv. Memo, PaletteForm

Ein Thema von xaromz · begonnen am 20. Sep 2005 · letzter Beitrag vom 29. Aug 2008
Antwort Antwort
Seite 2 von 3     12 3      
xaromz
Registriert seit: 18. Mär 2005
Hallo,

ich hab endlich unsere Homepage überarbeitet. Da gibt es jetzt auch den Menüpunkt "Entwicklung". Obwohl noch nicht allzuviel drauf ist, habe ich immerhin schon drei Komponenten zum Download:
  • SVGImage: SVGs in Delphi anzeigen (als eigenes Control oder im TImage)
  • MWKEdit: Memo mit Erweiterungen: Rechtschreibprüfung (ASpell), Formatierung, Unicode
  • PaletteForm: Fensterkomponente, um schwebende Paletten zu designen
Alle Komponenten laufen unter Delphi 7, andere Versionen hab ich nicht getestet.

Die Komponenten mit Erklärung und Screenshots gibts hier.
Möglicherweise hat ja der eine oder andere Interesse an dem Zeug.

Gruß
xaromz
//Edit: Auf Hinweis von Robert die Archive "entmüllt"

Update: Neue Version von MWKEdit. Jetzt mit eingebautem RTF-Support und überarbeitetem Beispielprogramm.

Update: Link angepasst.
 
Der_Unwissende
 
#11
  Alt 7. Dez 2005, 17:54
Hi,
echt nette Komponenten! Steckt sicherlich ne Menge Arbeit hinter.
Aber du solltest beim Editor noch einen Link/Hinweis auf TNT-Unicode Komponenten setzen, wäre nett.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#12
  Alt 7. Dez 2005, 18:19
Hallo,
Zitat von Nils_13:
Wenn ich die PaletteForm auf die Form setze, kommt der Fehler 'Element " hat kein übergeordnetes Fenster'.
da hat sich wohl ein Fehler eingschlichen. Danke für den Hinweis. Überarbeitete Version ist online.

Zitat von Der_Unwissende:
Aber du solltest beim Editor noch einen Link/Hinweis auf TNT-Unicode Komponenten setzen, wäre nett.
Das ist ein Überbleibsel eines Tests. Ich hab den Editor jetzt umgestellt, so dass die Standard-Controls verwendet werden. Dann gibt's zwar Probleme mit exotischen Sprachen, aber dafür läuft's überall.

Gruß
xaromz
  Mit Zitat antworten Zitat
0KommaNix

 
Delphi 11 Alexandria
 
#13
  Alt 20. Jul 2006, 04:25
Hallo xaromz,

auf der Suche nach einer Möglichkeit in Delphi SVG-Grafiken erstellen zu können habe ich deine SVGImage Komponent gefunden. Leider ist der Quelltext zum SVG-Viewer-Demo nicht mit dabei. Bin jetzt erst mal etwas ratlos wie ich die dort gezeigte Zoom-Funktion hinbekommen kann. Die Komponente selbst hat keine Eigenschaft 'Zoom'. Ich vermute, dass ich die SVG-Daten ändern und der Komponente jedes Mal neu unterschieben muss. Nichts was ich bisher probiert habe hat funktioniert. Könntest du mir bitte einen Tipp geben?

An besten ich beschreibe mal kurz was ich machen will, vielleicht ist meinen Anwendungsfall mit deine Komponente nicht so ohne weiteres realisierbar.

Mein Programm dient der Reparatur von beschädigten Dateidaten. Der Inhalt der zu reparierenden Datendatei besteht aus mehreren Chunks die auch ineinander verschachtelt sein können. Das Programm soll die Datei analysieren und die Datenstruktur grafisch darstellen. Ich dachte dabei an ein Band aus Rechtecken. Jedes Rechteck stellt ein Chunk dar. Die äußeren Chunk umschließt die jeweiligen inneren Chunks. Zum Beginn sieht der Anwender ein Übersichtsbild der gesamte Datei. Dabei werden die gefundenen Problemstellen farbig markiert. Um eine Problemstelle genauer Untersuchen zu können, muss sich der Anwender in das Bild hineinzoomen können. Er sollte die Möglichkeit haben einen Selektionsrahmen aufziehen zu können. In eingezoomten Zustand muss selbstverständlich auch ein Scrollen funktionieren. Solange der Anwende die Daten nicht editiert ist das SVG-Bild statisch. Durch Zoomen und Scrollen wird nur die "Viewbox" verändert. Folgender Versuch hat leider nicht funktioniert:

Delphi-Quellcode:
const
  TestSVG : WideString = (
    '<?xml version="1.0" encoding="utf-8"?>'#13#10+
    '<svg width="401.945" height="285.839" viewBox="0 0 %f %f" overflow="visible" '+
                            'enable-background="new 0 0 401.945 285.839">'#13#10+
      ' <g id="Ebene_1">'#13#10+
      ' <rect x="18.972" y="56.919" transform="matrix(0.9416 0.3368 -0.3368 0.9416 59.8869 -59.3444)" fill="#FFFFFF" stroke="#000000" width="364" height="172"/>'#13#10+
      ' </g>'#13#10+
    '</svg>'#13#10
  );

procedure TForm1.ScrollBar1Change(Sender: TObject);
var
  scale: double;
begin
  scale := ScrollBar1.Position*0.2;
  SVGImage1.SVG.LoadFromText(Format(TestSvg,[401.945*Scale, 285.839*scale]));
  SVGImage1.Update;
end;
Was SVG betrifft bin ich ein totaler Anfänger.

Gruß
Bernd
Bernd
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#14
  Alt 20. Jul 2006, 12:05
Hallo,

Erstmal Herzlich Willommmen in der DP!

Zitat von 0KommaNix:
auf der Suche nach einer Möglichkeit in Delphi SVG-Grafiken erstellen zu können habe ich deine SVGImage Komponent gefunden. Leider ist der Quelltext zum SVG-Viewer-Demo nicht mit dabei. Bin jetzt erst mal etwas ratlos wie ich die dort gezeigte Zoom-Funktion hinbekommen kann. Die Komponente selbst hat keine Eigenschaft 'Zoom'. Ich vermute, dass ich die SVG-Daten ändern und der Komponente jedes Mal neu unterschieben muss. Nichts was ich bisher probiert habe hat funktioniert. Könntest du mir bitte einen Tipp geben?
Klar kann ich Dir einen Tipp geben. Mein SVG-Demo benutzt nicht das SVGImage, sondern nur ein TSVG und eine TPaintbox (TSVGImage ist weit später entstanden). Dabei wird einfach eine Rect-Struktur berechnet, in die das SVG gezeichnet wird.

Ich habe gerade die SVGImage-Komponente überarbeitet, jetzt besitzt sie eine Eigenschaft "Scale". Damit solltest Du Dein Problem lösen können. Download auf meiner Webseite.

Zitat von 0KommaNix:
An besten ich beschreibe mal kurz was ich machen will, vielleicht ist meinen Anwendungsfall mit deine Komponente nicht so ohne weiteres realisierbar.

[snip]
Das hört sich aber schon so an, als wäre eine TPaintbox, auf die die ganzen Sachen gemalt werden, die bessere Alternative.
Zitat von 0KommaNix:
Folgender Versuch hat leider nicht funktioniert:

[snip]
Du bearbeitest hier ja nur die Viewbox, nicht die Größe des SVG (<svg width="401.945" height="285.839" ... ). Außerdem kann das so nicht funktionieren, da ein TSVGImage sich (bisher) überhaupt nicht um die tatsächliche Größe eines SVG gekümmert hat.
Zitat von 0KommaNix:
Was SVG betrifft bin ich ein totaler Anfänger.
War ich auch bis vor Kurzem .

Gruß
xaromz
  Mit Zitat antworten Zitat
0KommaNix

 
Delphi 11 Alexandria
 
#15
  Alt 20. Jul 2006, 14:44
Hallo,

Vielen Dank für den Willkommensgruß und die schnelle Hilfe.
Leider kann ich die neuen Quelltexte nicht kompilieren. Sind die Units
WideStringList und StringLibrary von dir oder kann ich die mir irgendwo herunterladen?

Ich habe mir MSXML 4.0 SP 2 vom der Microsoft Seite besorgt. Bei den Versuch die Typbibliothek zu installieren kommt die Fehlermeldung:
“A class named TDOMDocument is already installed”. Ich kann die Komponente nicht finden und bin mir auch sicher, dass ich noch nie was mit XML gemacht habe. Ich habe hier eine englische Delphi 7 (Build 8.1) Enterprise so ziemlich im Originalzustand. Die Unit MSXML2_TLB.pas konnte ich ohne Überschreibenwarnung erzeugen. Befürchte jetzt aber ein Versionschaos bezüglich den MSXML-Komponenten.

Da auch XML für mich Neuland ist, würde mich interessieren ob es einen Grund gegen Open XML gibt oder was der Grund war, dass du dich für MS-XML entschieden hast. Aber das nur am Rande – wichtiger ist mir eigentlich so schnell wie möglich deine Komponente ausprobieren zu können.

Gruß
Bernd
Bernd
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#16
  Alt 20. Jul 2006, 15:40
Hallo,

Zitat von 0KommaNix:
Leider kann ich die neuen Quelltexte nicht kompilieren. Sind die Units WideStringList und StringLibrary von dir oder kann ich die mir irgendwo herunterladen?
ich habe da leider einige Dateien vergessen. Da ich die Webseite gerade nicht updaten kann, hänge ich ein Archiv mit den fehlenden Dateien an.
//Edit: Habe das Archiv auf der Webseite aktualisiert.
Zitat von 0KommaNix:
Ich habe mir MSXML 4.0 SP 2 vom der Microsoft Seite besorgt.
Hol' Dir lieber MSXML6.
Zitat von 0KommaNix:
Da auch XML für mich Neuland ist, würde mich interessieren ob es einen Grund gegen Open XML gibt oder was der Grund war, dass du dich für MS-XML entschieden hast.
Dass ich mich für MSXML entschieden habe, liegt daran, dass es auf dem Rechner installiert war. Ich habe mir bisher einfach keine andere Implementierung angesehen.

Gruß
xaromz
Angehängte Dateien
Dateityp: zip bibliotheken_206.zip (49,6 KB, 26x aufgerufen)
  Mit Zitat antworten Zitat
0KommaNix

 
Delphi 11 Alexandria
 
#17
  Alt 21. Jul 2006, 00:21
Hurra, es funktioniert!!!

Nun habe ich ein bisschen rumgespielt um herauszubekommen wie ich an besten Zoom und Bildlauf hinbekommen könnte. Einige Dinge funktionieren nicht wie ich es erwartet/gewünscht hätte, vielleicht liegt es ja daran, dass du noch an der Komponente arbeitest und noch nicht alles funktioniert wie geplant. Erschweren kommt hinzu, das ich nicht wissen kann für welchen Zweck du die Komponente entwickelst, bzw. wie dein Konzept aussieht.

Hier meine Wunschvorstellung/Vorschläge:

1.) Besser als den nun eingebaute Scale Eigenschaft würde es mir gefallen, wenn ich ein Eigenschaft ViewRect(Top, Left, Width, Height) hätte, mit dem ich angeben könnte welchen Teil des SVG-Canvas in TSVGImage dargestellt werden soll. Stretch, Center und Proportional müssten dazu abgeschalten sein. Der Anwender von ViewRect ist selbst für die Realisierung dieser Funktionen verantwortlich, indem er das Rechteck entsprechent wählt. Für Top und Left müssen auch negative Werte möglich sein um zentrieren zu können. Width und Height sind immer positiv. Damit das ganze Funktioniert müssen beim Laden einer SVG-Grafik die Eigenschaften Width und Height von TSVGImage.SVG auf die Boundingbox der Grafik gesetzt werden:
if exist SVG Attribut Width then
Boundingbox.Width := Max(Boundingbox.Width, SVG Attribut Width);
TSVGImage.SVG.Width := Min(TSVGImage.SVG.Width, Boundingbox.Width);
if exist SVG Attribut Heigth then
Boundingbox.Height := Max(Boundingbox.Height, SVG Attribut Heigth);
TSVGImage.SVG.Height := Min(TSVGImage.SVG.Height, Boundingbox.Height);

Ich stelle mir die Verwendung für eine zu programmierende TSVGScrollbox-Komponente dann so vor:
- Durch setzen von TSVGImage.SVG.Width / Height wird die Größe des leeren Dokumentes gesetzt.
Die Scrollbalken können bei Bedarf angezeigt werden.
- Beim Laden einer SVG-Grafik wird Viewbox ignoriert und die Width/Height Attribute wirken
wie oben beschrieben.

2.) Zuladen weiterer SVG-Grafik zulassen.

3.) Eigenschaft BackgrundColor: Ein-/Ausschaltbar. Ausgeschaltet entspricht den jetzigen verhalten. Eingeschaltet wird das Canvas zuerst in der Hintergrundfarbe gefüllt. Default Farbe ist Weiß.

4.) Darstellung auf dem Formular zur Entwicklerzeit:
Quelle: http://wiki.delphigl.com/index.php/T...tenentwicklung

Delphi-Quellcode:
procedure TSVGImage.Paint;
// ...
begin
  inherited;//Zeichen Procedure des Vorfahren aufrufen.
  if csDesigning in ComponentState then //Wenn sich die Komponente in Entwicklung befindet.
  begin
    {Zeichung eines gestrichelten Rahmens}
    Canvas.Brush.style := bsClear;//Durchsichtiges Rechteck
    Canvas.Pen.style := psDashDot;//Gestrichelte Linen
    Canvas.Rectangle(0,0,width,height);//Rechteck zeichnen
 
    {Namen der Komponente in die Mitte schreiben}
    canvas.TextOut((width - Canvas.TextWidth(Name)) div 2,(height - Canvas.TextHeight(Name)) div 2,name);
 
    {Keine weitern Zeichnungen mehr ausführen}
    exit;//Verlässt die Procedure
  end;
  //Normale Zeichen-Anweisungen
  //...
end;
5. Open XML wird ziemlich gelobt, es scheint nur wie so offt bei der Dokumentation zu hapern.
Habe zum Thema http://homepages.borland.com/ccalver...XMLSimple.html
gefunden.
Open XML hätte den Vorteil auf Linux portierbar zu sein und man bräuchte keine Drittanbieter Komponenten mit ausliefern. Beides ist für mich nicht so wichtig.

Gruß
Bernd
Bernd
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#18
  Alt 21. Jul 2006, 09:18
Hallo,
Zitat von 0KommaNix:
Nun habe ich ein bisschen rumgespielt um herauszubekommen wie ich an besten Zoom und Bildlauf hinbekommen könnte. Einige Dinge funktionieren nicht wie ich es erwartet/gewünscht hätte, vielleicht liegt es ja daran, dass du noch an der Komponente arbeitest und noch nicht alles funktioniert wie geplant. Erschweren kommt hinzu, das ich nicht wissen kann für welchen Zweck du die Komponente entwickelst, bzw. wie dein Konzept aussieht.
Meine Idee war lediglich, dass ich SVGs darstellen kann. Dabei wollte ich diese nur auf einen Canvas malen. Dass man nun ein SVG auch in ein TImage laden kann, ist nur eine Erweiterung des ursprünglichen Plans. Das hab' ich eher nebenher gemacht.
Zitat von 0KommaNix:
Hier meine Wunschvorstellung/Vorschläge:

1.) Besser als den nun eingebaute Scale Eigenschaft würde es mir gefallen, wenn ich ein Eigenschaft ViewRect(Top, Left, Width, Height) hätte, mit dem ich angeben könnte welchen Teil des SVG-Canvas in TSVGImage dargestellt werden soll. Stretch, Center und Proportional müssten dazu abgeschalten sein. Der Anwender von ViewRect ist selbst für die Realisierung dieser Funktionen verantwortlich, indem er das Rechteck entsprechent wählt. Für Top und Left müssen auch negative Werte möglich sein um zentrieren zu können. Width und Height sind immer positiv. Damit das ganze Funktioniert müssen beim Laden einer SVG-Grafik die Eigenschaften Width und Height von TSVGImage.SVG auf die Boundingbox der Grafik gesetzt werden:
if exist SVG Attribut Width then
Boundingbox.Width := Max(Boundingbox.Width, SVG Attribut Width);
TSVGImage.SVG.Width := Min(TSVGImage.SVG.Width, Boundingbox.Width);
if exist SVG Attribut Heigth then
Boundingbox.Height := Max(Boundingbox.Height, SVG Attribut Heigth);
TSVGImage.SVG.Height := Min(TSVGImage.SVG.Height, Boundingbox.Height);

Ich stelle mir die Verwendung für eine zu programmierende TSVGScrollbox-Komponente dann so vor:
- Durch setzen von TSVGImage.SVG.Width / Height wird die Größe des leeren Dokumentes gesetzt.
Die Scrollbalken können bei Bedarf angezeigt werden.
- Beim Laden einer SVG-Grafik wird Viewbox ignoriert und die Width/Height Attribute wirken
wie oben beschrieben.
Wie ich schon in einer vorigen Nachricht geschrieben habe, wäre da ein TCanvas besser, auf dem Du ein TSVG malst. Das sieht dann so bsp. so aus:
Delphi-Quellcode:
procedure PaintSVGTo(SVG: TSVG; Canvas: TCanvas; Left, Top: Integer; Scale: Double);
var
  W, H: Integer;
begin
  W := Round(SVG.Width * Scale);
  H := Round(SVG.Height * Scale);
  SVG.PaintTo(Canvas.Handle,
    MakeRect(Left, Top, W, H));
end;
Zitat von 0KommaNix:
2.) Zuladen weiterer SVG-Grafik zulassen.
Auch das funktioniert nur mittels TCanvas und Malen der einzelnen SVGs. Du kannst aber die SVGs in einer TSVGImageList organisieren. Alternativ kannst Du natürlich ein SVG aus zweien zusammenbauen, indem Du beide einliest und dann die Knoten des einen SVGs unterhalb von Root in das andere kopierst.
Zitat von 0KommaNix:
3.) Eigenschaft BackgrundColor: Ein-/Ausschaltbar. Ausgeschaltet entspricht den jetzigen verhalten. Eingeschaltet wird das Canvas zuerst in der Hintergrundfarbe gefüllt. Default Farbe ist Weiß.
Ein SVG ist grundsätzlich immer transparent. Es wird nur gezeichnet, was im SVG definiert ist. Das ist so gewollt. Wenn Du einen Hintergrund haben willst, musst Du diesen (z. B. als weißes Rechteck) im SVG definieren.
Zitat von 0KommaNix:
4.) Darstellung auf dem Formular zur Entwicklerzeit:
Quelle: http://wiki.delphigl.com/index.php/T...tenentwicklung
Stimmt. Das hat mich auch schon immer gestört. Ich war nur zu faul.
Ist erledigt.
Zitat von 0KommaNix:
5. Open XML wird ziemlich gelobt, es scheint nur wie so offt bei der Dokumentation zu hapern.
Habe zum Thema http://homepages.borland.com/ccalver...XMLSimple.html
gefunden.
Open XML hätte den Vorteil auf Linux portierbar zu sein und man bräuchte keine Drittanbieter Komponenten mit ausliefern. Beides ist für mich nicht so wichtig.
Diese Komponente baut dermaßen auf Windows-Funktionen auf, dass eine Protierung sowieso nicht in Frage käme. Irgendwann werde ich das vielleicht mal auf .Net portieren, da ist der Aufwand nicht so groß.

Gruß
xaromz
  Mit Zitat antworten Zitat
0KommaNix

 
Delphi 11 Alexandria
 
#19
  Alt 21. Jul 2006, 18:33
Hallo,
Zitat von xaromz:
Wie ich schon in einer vorigen Nachricht geschrieben habe, wäre da ein TCanvas besser, auf dem Du ein TSVG malst. Das sieht dann so bsp. so aus:
Delphi-Quellcode:
procedure PaintSVGTo(SVG: TSVG; Canvas: TCanvas; Left, Top: Integer; Scale: Double);
var
  W, H: Integer;
begin
  W := Round(SVG.Width * Scale);
  H := Round(SVG.Height * Scale);
  SVG.PaintTo(Canvas.Handle,
    MakeRect(Left, Top, W, H));
end;
Vielen Dank, so werde ich es machen.

Gruß Bernd
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#20
  Alt 28. Aug 2008, 23:11
Auch wenn es etwas her ist, aber unter welcher Lizenz steht der Quelltext?

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 11:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz