Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Durchsichtiges Fenster (nicht Alpha Blend) (https://www.delphipraxis.net/11446-durchsichtiges-fenster-nicht-alpha-blend.html)

Mithrandir 25. Mär 2009 13:23

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Zitat:

Zitat von Daniel
Einmal gegentreten, schon passt die Darstellung wieder. :stupid:

German engineering in da house, ya! :mrgreen:

//Edit: @Frank: Der W3C Validator lieferte defekte Tabellen-Tags, insgesamt 9 Fehler und 423 Warnungen. :shock: Jetzt sind es nur noch 5 Fehler und 423 Warnungen.. :stupid:

Daniel 25. Mär 2009 13:32

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Zitat:

Zitat von _frank_
wie so oft...mal im Ernst, was war denn verkehrt? hat irgendwo ein Tag gefehlt?

Ja, hin und wieder fehlt ein Tag. Das rieselt dann zwischen den Lüfterschlitzen durch und wird dann auf dem Boden des Serverkellers liegend weggefegt.

Streng genommen kann ich Dir gar nicht sagen, warum manchmal nur kleine Tags fehlen und nicht gleich halbe Beiträge.
is' eben so ...
;-)

Nelphin 28. Mär 2009 16:48

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Zitat:

Zitat von _frank_
probiers mal so (von hier):

Delphi-Quellcode:
const
  CAPTUREBLT = $40000000;

DC := GetWindowDC(0);
try
  BitBlt(BackBuf.Canvas.Handle, 0, 0, BackBuf.Width, BackBuf.Height, DC, 0, 0, SRCCOPY or CAPTUREBLT);
finally
  ReleaseDC(0, DC);
end;
//Edit:
das mit dem Wasserzeichen versteh ich nicht ganz...wozu brauchst du da alphablending? warum nicht einfach die normalen Canvas-Methoden, um Text/Rahmen hinzumalen?

HTH Frank

Hallo,

also ich bin ein wenig am Verzweifeln, und zwar versuche ich mithilfe dieses codes eine art kurzen "motion grabber" zu schreiben. Ich bekomme es aber nicht sauber hin... wenn ich alles in eine procedur packe, dann kommt nach ca. 70 ganzbildjpgs (~á400kb) irgendwas mit "Für diesen Befehl ist nicht genügend Speicher vorhanden".
Das kann aber eigentlich nicht sein... denn wenn ich bilder von der platte lade (habsch getestet) dann kann ich 4500 (~á400kb) problemlos laden, bis es dann zu stottern anfängt und irgendwann die fehlermeldung "Nicht genügend Arbeitsspeicher" kommt.
(wer jetzt die stirn runzelt sei einigermaßen beruhigt: ziel ist es ca. 3600 bilder à 100-200kb aneinanderzureihen sollte also rechnerisch gehen)

versucht hatte ich es bisher mit einem array:
Delphi-Quellcode:
jpglisted: array of TJpegimage;
dann wollte ich das ganze durch eine schleife rennen lassen die ungefähr folgendes macht:

Delphi-Quellcode:
procedure TForm1.newscreenshot(sender:TObject);
var
  screenshotjpg: TJpegimage;
  DC:HDC;
  screenshot: TBitmap;
  i:integer;
const
  CAPTUREBLT = $40000000;
begin                              
DC := GetWindowDC(0);
try
  screenshot := TBitmap.Create;
  screenshot.Width := form2.Shape1.Width;
  screenshot.Height:= form2.Shape1.height;
  screenshot.PixelFormat := pfDevice;
finally
        BitBlt(screenshot.Canvas.Handle, 0, 0, screenshot.Width, screenshot.Height, DC,(form2.Left+form2.Shape1.left),
        (form2.Top+form2.shape1.top), SRCCOPY or CAPTUREBLT);
        releaseDC(0,DC);

         jpglisted[geschafft] := Tjpegimage.Create;
        try
         jpglisted[geschafft].assign(screenshot);
        finally
          screenshot.Free;
          screenshot:=nil;        //spätestens ab hier sollte doch nur noch das jpg im speicher sein...
        end;
    end;
ich hab zwischendrin auch mal versucht der datenflut über tmemorystream oder tfilestream herr zu werden aber beide prozesse brauchen pro jpgbild ~200ms was zu langsam ist.

ich vermute mal das ich das jpglisted[geschafft] noch .freeen müsste und das bild vorher (sauber getrennt) woanders hin übergeben müsste... aber ich weiss net wie das geht :(

arrays, streams, und all das ist neuland für mich, ich bin Anfänger :)
Deshalb würde ich mich über anfängerfreundliche Antworten freuen, vielleicht hat ja auch jemand lust mir den Mentor via MSN zu machen :D das wär schon klasse mal zwischendrin jemand fragen können mit Ahnung.

lieben Gruß

//EDIT:

was mir beim testen eben aufgefallen ist, wenn ich die bilder einzeln einer Tjpegliste hinzufüge wächst mein Programm im Taskmanager überhaupt nicht.... es bleibt bei 3822 byte obwohl ich 50 bilder hinzufüge... (bei 75 steigt er dann wieder aus und behauptet keinen speicher mehr für den befehl zu haben) kann es sein das er die bilder nicht im arbeitsspeicher sondern in irgendeinem viel kleineren puffer abzulegen versucht??? Wenn ich bilder (mit dem gleichen programm) von platte (in die gleiche liste) lade wird brav bei jedem neu geladenen bild auch das projekt im taskmanager größer....

// EDIT2...

ok, nachdem ich jetzt noch mehr rumprobiert und ausprobiert habe bin ich mir fast sicher: die von mir erzeugten bilder liegen in irgendeinem resourcenpuffer und solange ich sie nicht
1.) rausschreibe
2.) freigebe
3.) wieder reinlade
lassen sie sich auch durch nichts in meiner macht stehende dazu bringen in die gewaltigen hallen meines arbeitsspeichers zu hüpfen, sondern blockieren lieber weiter die engen flure...

jetzt hab ich zwar ne lösung (savetofile -> free -> loadfromfile) aber das ist doch krank und dauert fast ne halbe sekunde pro bild... gibts keinen befehl der Delphi zwingt ein bmp aus dem device context in den arbeitsspeicher zu schieben um den DC dann sauber deleten zu können?

über anfängerfreundliche antworten würde ich mich wie immer sehr freuen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 3 von 3     123   

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