AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Neuer Blog über FireMonkey Entwicklung eröffnet

Ein Thema von Harry Stahl · begonnen am 7. Mär 2013 · letzter Beitrag vom 12. Mai 2023
Antwort Antwort
Seite 3 von 8     123 45     Letzte » 
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.475 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 02:23
Gerade habe ich einen neuen Blogbeitrag hochgeladen, der beschreibt, wie man FireMonkey–Funktionen von einer VCL-Anwendung aus per FMX-DLL nutzen kann.

Es wird gezeigt, wie man z.B. ein Bitmap aus seiner VCL-Anwendung an den FireMonkey-DLL Dialog übergibt und mit Hilfe des PaperSketch-Effekts verändert und dann wieder an die VCL-Anwendung zurück gibt: http://www.devpage.de/blog/firemonkey.htm.

Im Blogbeitrag ist auch ein Link auf mein YouTube-PixPower-Kanal, wo man sich die Funktion direkt in Aktion ansehen kann.

Viel Spaß damit.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 10:18
etwas OT...

Das Pix-Power ist ja (dem ersten Eindruck nach) der Hammer.
Das werde ich mir mal die nächsten Tage näher ansehen.

Nutzt Du da DirectX, OpenGL oder o.ä. und lässt jetzt FMX extern Effekte berechnen?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 12:16
Es werden wohl die Filtereffekte von FMX verwendet ( Dll verwendet FMX und gibt die Bilder über Memorystream an VCL Anwendung), wie er vorgeht beschreibt er in dem genannten Blogeintrag.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 14:50
Ok, habe Mittag mal schnell drüber gelesen. Ich dachte nur nicht, dass das bisher reine VCL war. Ich bin jedenfalls beeindruckt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.475 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 18:34
etwas OT...
Das PixPower ist ja (dem ersten Eindruck nach) der Hammer.
Danke! Von einem Entwicklerkollegen so ein Kompliment zu hören, freut mich natürlich riesig.

etwas OT...
Nutzt Du da DirectX, OpenGL oder o.ä. und lässt jetzt FMX extern Effekte berechnen?
FMX ist mit dem im Blog gezeigten Beitrag erstmals mit der DLL zu dieser VCL-Anwendung dazu gekommen und macht derzeit wirklich nur diesen PaperSketch-Effekt. Ansonsten ist alles VCL und Windows-API bzw. eigene optimierte Grafikbearbeitungsroutinen.

An Drittkomponenten nutze ich nur ImageEn, um die Photoshop-Datei einzulesen und später wieder zu speichern, die ganze Ebenenverwaltung, Zeichnung, Auswahlen etc. mache ich selber.

Aber ich plane noch eine Reihe von Dingen über die DLL-Lösung in das VCL-Programm zu integrieren, bevor ich eine reine FMX-Anwendung daraus mache. Einige Funktionen unter FMX sind besser und schneller, als unter (Standard-)Windows möglich.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#26

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 20:33
Mal eine bescheidene Frage:

Hast du das wirklich so in einer realen Anwendung drin?
Delphi-Quellcode:
function ShowBitmapFromStream (ms: TMemoryStream; fn: shortString): ShortString;
var
  Filter: FMX.Filter.TFilter;
begin
  Filter := TFilterManager.FilterByName('PaperSketch');

  try
    F_Filters := TF_Filters.Create(Application);
    F_Filters.ImageViewer1.bitmap.LoadFromStream(ms);

    if F_Filters.ShowModal = mrOK then begin

      Filter.ValuesAsBitmap['Input'] := F_Filters.ImageViewer1.bitmap;
      Filter.ValuesAsFloat ['BrushSize'] := F_Filters.TrackBar1.Value;
      F_Filters.ImageViewer1.bitmap := TBitmap (Filter.ValuesAsBitmap['Output']);

      F_Filters.ImageViewer1.bitmap.SaveToFile (fn);

      Result := fn;
   end else begin
     Result := '';
  end;

  finally
    F_Filters.Free;
  end;
end;
Da fallen mir so ein paar Dinge auf, die ich so nicht machen würde:
  • den Dateinamen würde ich per WideString übergeben
  • den Stream würde ich per IStream übergeben
  • ich würde überhaupt keinen Dateinamen übergeben und den Austausch auch nicht über eine Datei machen, sondern per IStream zurückliefern
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.475 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 21:39
Also die tatsächliche Implementierung hat natürlich noch ein paar Sicherheitsprüfungen an verschiedenen Stellen dazu, die ich aber zur besseren Lesbarkeit des Source-Codes hier weggelassen habe.

Zu IStream kann ich nicht viel sagen, da ich bislang damit noch nichts zu tun hatte.

Aber ich lerne gerne dazu.
Warum würdest Du also IStream hier verwenden?
Und gibt es das überhaupt für FireMonkey?

Weshalb ich einen Shortstring verwende, habe ich ja im Blogbeitrag beschrieben.
Warum würdest Du statt dessen lieber Widestring verwenden?

Ich stimme Dir zu, die Rückgabe eines Bitmap-Streams wäre eleganter (und noch ein wenig performanter). Habe ich ja selber im Blogbeitrag beschrieben, dass ich es mir ein wenig bequem mache. Es war letztlich aber nicht nur Bequemlichkeit.

Wenn ich einen FireMonkey-Bitmap-Memorystream (oder IStream?) wieder auf VCL-Seite annehmen würde, müsste ich dort wieder notgedrungen einige FMX-Units aufnehmen, um über eine Firemonkey-TBitmap eine Konvertierung in eine VCL-TBitmap vorzunehmen. Was grundsätzlich geht, aber es wären einfach eine Reihe zusätzlicher Randbedingungen in meinem Source-Code zu ändern gewesen, so dass ich eben die Lösung mit der temporären Datei gewählt habe.

Und die Empfehlung von EMBA, VCL-Code und FMX-Code nicht zu mischen, macht für mich auch grundsätzlich Sinn.

Jedenfalls funktioniert es in meiner Anwendung tadellos.

Geändert von Harry Stahl (13. Feb 2014 um 22:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#28

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 13. Feb 2014, 23:55
Die Funktionalität will ich deiner Umsetzung gar nicht absprechen, sie ist nur unschön.
  • WideString kann auch Unicode und ist somit in der Lage wirklich alle Dateinamen zu transportieren
  • MSDN-Library durchsuchenIStream ist ein Stream-Interface von Microsoft und hat nichts mit FMX oder VCL zu tun. Das Interface ist in Delphi-Referenz durchsuchenWinapi.ActiveX zu finden und mit einem Delphi-Referenz durchsuchenSystem.Classes.TStreamAdapter kannst du dir so einen IStream von einem normalen TStream holen.
Der ganze Aufruf sieht dann mit einem IStream so aus (die Rückgabe erfolgt im gleichen Stream ):
Delphi-Quellcode:
function ProcessBitmap( ABitmap : TBitmap ):Boolean
var
  LStream : TStream;
begin
  LStream := TMemoryStream.Create;
  try
    ABitmap.SaveToStream( LStream );
    if ShowBitmapFromStream( TStreamAdapter.Create( LStream, soReference ) ) then
    begin
      LStream.Seek( 0, soFromBeginning );
      ABitmap.LoadFromStream( LStream );
    end;
  finally
    LStream.Free;
  end;
end;
BTW:

Ich habe gerade die Vorlage für deinen Code entdeckt
http://blogs.embarcadero.com/stephen...l-application/

Nun ja, die Beispiele sind von denen halt auch nicht so der Brüller.

Und den Grund für die Rückgabe als Datei habe ich auch entdeckt (ein echter Schenkelklopfer):

FMX.Graphics.TBitmap.LoadFromStream analysiert den Stream und erkennt das Grafikformat - sehr löblich.

FMX.Graphics.TBitmap.SaveToStream speichert das Bild stumpf als PNG in den Stream
FMX.Graphics.TBitmap.SaveToFile speichert das Bild in dem Format ab, was von der Dateiendung erkannt wird.

Schaut man sich den Code von TBitmap.SaveToStream an, dann sieht man aber auch sofort, wie man das abändern kann
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Feb 2014 um 00:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.475 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 14. Feb 2014, 00:55
Vielen Dank für Deine Erläuterungen:

* Für Widestring müsste man wieder die ShareMem-Interface-Unit einbinden und zusätzlich die BORLNDMM.DLL weitergeben.
Warum sollte ich das machen, wenn ich bei der gezeigten Implementation gar keine Unicodenamen brauche? Wenn ich es doch brauchen sollte, verwende ich PChar, so kann ich Unicode verwenden, brauche aber die erwähnte Unit und DLL nicht.

* Ich hatte zuvor für mich schon einmal die Rückgabe mit dem TMemoryStream implementiert. Die Rückgabe funktionierte genau so, wie die hier von Dir vorgeschlagene Lösung mit dem IStream. Beides mal kommen für sich gesehen auch gültige Streams an. Das habe ich insofern getestet, als dass ich den Stream als Bitmap-Datei gespeichert habe und mit einer FireMonkey-Applikation konnte man diese Bitmap-Datei dann einlesen.

Aber auch bei Deiner Lösung wird das einlesen des Streams in die VCL-Bitmap mit der Fehlermeldung quitiert, dass die Bitmap ungültig sei.

Grund ist der, dass ja ein Stream für eine FireMonkey-Bitmap zurückgeliefert wird und den kann ich nun mal nicht in eine VCL-Bitmap einlesen, weil die eben nicht kompatibel sind.

Insofern funktioniert der von Dir vorgeschlagene Weg mit dem IStream als "schönere" Lösung hier leider auch nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.475 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 14. Feb 2014, 01:03
Oh, da hat sich Deine ergänzende Antwort mit meiner überschnitten.

In
Delphi-Quellcode:
procedure TBitmap.SaveToStream(Stream: TStream);
var
  Surf: TBitmapSurface;
begin
  Surf := TBitmapSurface.Create;
  try
    Surf.Assign(Self);
    TBitmapCodecManager.SaveToStream(Stream, Surf, '.png');
  finally
    Surf.Free;
  end;
end;
hatte ich natürlich auch schon reingesehen, aber jetzt durch Deinen Hinweis, dass man es "sofort sehen würde, was man abändern kann", habe ich nun auch gesehen, dass der Stream im PNG-Format gespeichert wird. OK. Das sollte man in der Tat ändern können, muss mal sehen, wie ich das am Besten mache. Dann sollte auch der Weg über einen Stream insgesamt gehen.

Aber heute nicht mehr, morgen mach ich weiter...

Jedenfalls Danke für Deine Hinweise, es freut mich immer wieder, wenn am Ende eine neue Erkenntnis steht.

Geändert von Harry Stahl (14. Feb 2014 um 01:07 Uhr)
  Mit Zitat antworten Zitat
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 09:09 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