Autor Beitrag
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Do 05.08.04 00:14 
Wer hat hier bereits einen Bildschirmschoner programmiert?

Ich zumindest habe Probleme bei der Zuweisung von Preview. Unter Preview verstehe ich die Ausführung des Bildschirmschoners innerhalb des Dialogfensters unter "Eigenschaften von Anzeige"/"Bildschirmschoner". Öffnet man dieses Dialogfenster und geht auf Bildschirmschoner, so startet dieser automatisch den aktuellen Bildschirmschoner mit dem Parameter /P und als zweitem Parameter dem Handle des Prevew-Fensters. Der Programmierer des Bildschimschoners muß sein Programm dann innerhalb des kleinen Fensters als Child Fenster ausführen. Da mein Bildschirmschoner mindestens 400 x 400 Pixel benötigt, kann ich ihn nicht in dem kleinem Fenster ausführen. Deshalb hab ich ein zweites Fenster in dem eine Grafik zeigt was der Bildschirmschoner macht.

Das Problem ist aber, daß das Previewfernster im "Eigenschaften von Anzeige"/"Bildschirmschoner" Dialogfenster schwarz bleibt. Die Frage ist also wo der Fehler liegt. Wenn einer einen Fehler im Programm vermutet, dann hier der Quellcode.

Zuerst die Projektdatei:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
...

var
  Param1: String;
  Param1Chr: Char;

...

begin
  if ParamCount > 0 then begin
    Param1 := UpperCase(ParamStr(1));
    Param1Chr := #32;
    if Length(ParamStr(1)) > 1 then Param1Chr := Param1[2];

    case Param1Chr of
      'P', 'L': begin
             Application.Initialize;
             Application.CreateForm(TPreview, Preview);
             Application.Run;
           end;
      ...
end.


Jetzt die Previewunit:

Die einzig wichtige Prozedur hier ist die Create Prozedur. Deshalb hab ich den Rest weggelassen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TPreview.FormCreate(Sender: TObject);
var
  OldStyle: Integer;
begin
  OldStyle := GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, (OldStyle AND NOT WS_POPUP) OR WS_CHILD OR WS_VISIBLE);

  if Length(ParamStr(1)) > 1 then
    if UpperCase(Paramstr(1))[2] = 'P' then
      Windows.SetParent(Handle, StrToInt(ParamStr(2)));

  Top := 0;
  Left := 0;
end;




//EDIT

Ich hab den Fehler. Es lag nicht am Quellcode, sondern an der Eigenschaft Position des Formulars. Ich hatte dort poScreenCenter eingestellt. Anscheinend klappt mit poScreenCenter nicht, da die mitte des Previewfensers nicht die mitte des Bildschirms ist. Mit poDesigned klappt es dann.

_________________
Gruß
Martin