Entwickler-Ecke

Freeware Projekte - Zitate-Screensaver


hitstec - Mi 12.02.03 22:30
Titel: Zitate-Screensaver
Mein Zitate-Bildschirmschoner ist fertig.

Nun grafisch haut er niemanden um. Erinnert so ein bißchen an die C64-Zeiten. Gut, aber seinen Dienst tut er schon.

In einem festgelegten Intervall wird ein zufälliges Zitat (von 3000) auf dem Bildschirm eingeblendet. Mit dem integrierten Editor ist es möglich eigene Zitate hinzuzufügen.

Mehr dazu hier: http://www.welchweiseworte.de/screensaver.php

Version: 1.0.6.14
Datum: 14.02.2003 18:28:56
Dateigröße: 0.470 MB

Direkter Link: http://www.hitstec.de/archiv.php?tool=4


In meinem Archiv habe ich ein Grund-Gerüst für einen Bildschirmschoner als Delphi-VCL-Quellcode zum Download bereitgestellt. Link: http://www.hitstec.de/archiv.php?site=3.


Delete - Mi 12.02.03 22:37

Nett.


hitstec - Mi 12.02.03 22:39

Das ging aber schnell. Danke.

:wink:


Delete - Mi 12.02.03 22:52

Wäre schön, wenn mann die Zitate durch eigene ergänzen könnte.


hitstec - Mi 12.02.03 22:59

Hmm, das geht nur bedingt.
Da 1. die DB in der Exe als Resource integriert ist, 2. die DB komprimiert ist, 3. die DB verschlüsselt ist, 4. die DB statisch ist, d.h. das Prog enthält nur die Funktionen zum Lesen jedoch nicht zum Schreiben, und 5. der Screensaver mit der Website WelchWeiseWorte.de per Hotkeys verknüpft ist.

Kannst mir ja die Zitate zu schicken. Werde sie bei der nächsten Version berücksichtigen.

Achja, fast hätte ich das vergessen:
In meinem Archiv habe ich ein Grund-Gerüst für einen Bildschirmschoner als Delphi-VCL-Quellcode zum Download bereitgestellt. Link: http://www.hitstec.de/archiv.php?site=3.

Damit kann man eigentlich in minutenschnelle einen eigenen Screensaver basteln.


Delete - Mi 12.02.03 23:04

Also ich hätte die Zitate in eine Ini-Datei gepackt, die man dann nach belieben selber editieren kann. Dann kannst du ja in den Einstellungen eine Option anbieten, ob man die eigenen verwenden will oder die aus dem Screensaver oder beide gemischt.


hitstec - Mi 12.02.03 23:14

Ja. Eine gute Idee.

Ich mache es am besten so: Der Schoner enthält einen "Editor", der es ermöglicht eigene Zitate in Form einer Ini-Datei anzulegen und eine Option, ob die angelegten Zitate angezeigt werden sollen, nur die Standard-Zitate, oder beide Möglichkeiten.

Das Problem ist nur, dass die Inis beim Auslesen ganz schön langsam sein können. 3000 Zitate, das sind an die 500 KB.

Was hälst du davon, Luckie?


Delete - Mi 12.02.03 23:19

Na ja bis man diese Anzahl an eigenen Zitaten zusammen hat dürfte es eine Weile dauern. Ini-Dateien können glaube ich auch gar nicht diese Größe erreichen. Da mußt du wohl auf ein egenes einfaches Txet-datei-Format zurückgreifen. Das mit der Ini-Datei war nur so eine schnelle Idee ohne weiter darüber nachgedacht zu haben.


Anonymous - Mi 12.02.03 23:25

Gefällt mir auch. Schlicht, aber gut.

Allerdings gibt es einige Sachen die ich richti hasse. Das ist wenn man irgendwo im Programm klick und man plötzlich im Internet ist. Zum Beispiel der Mediaplayer. Unten ein Logo. Zak und man ist im Internet. Noch schlimmer ist Musicmatch Jukebox. Ein fettes Logo das 20% des Fensters einnimmt. Da sich nicht zu verklicken ist schon ein Wunder. Ich hab so oft drauf geklickt, daß ich irgendwann die Schnauze voll hatte und das Programm deinstalliert habe. Inzwischen deinstalliere ich alle Programme die ungefragt eine Webseite offnen.

Dein Programm hat jetzt keine Fläche wo man draufklicken kann, aber es öffnet beim klick auf die F, A, K, T-Tasten eine Webseite.

Ist dir klar, daß einige Leute im Arbeitsvertrag stehen haben, daß sie beim Besuch des Internets fristlos gefeuert werden können. Stell dir vor ich benutze deinen Bildschirmschoner. Ich sehe den Cheff, klicke zufällig auf F-Taste, es öffnet sich eine Webseite und schon hängt der Job von der momentanen Laune des Chefs.

Es gibt insgesammt vier Tasten mit denen man automatisch ins Internet kommt. Ohne Rückfrage. Das ist für mich nicht akzeptabel und ich werde deshalb auch dein Programm nicht nutzen. Das mit der Vorwärts und Rückwärtstaste ist ja noch ok, aber ich will nicht beim einem Bildschirmschoner überlegen müssen welche Testen ich nicht klicken darf. Ich will keine Aktionen ausführen müssen nur weil ich den Bildschirmschoner beendet habe. Das heiß aber auch nicht, daß eine Abfrage vor dem Verbindungsaufbau ausreicht. Zum beenden des Schoners sollten alle Tasten zu verfügung stehen.

Ein Vorschlag: Kopple alle deine Tasten mit der <STRG> Taste, also z.B. <STRG>+<F>. Das kann man sich merken und für dich ist es kaum Aufwand es zu Ändern. Weiterhin solltest du (zusätzlich) vorher Rückfragen ob man wirklich die Internetverbindung aufbauen will.


hitstec - Mi 12.02.03 23:26

Aber im Prinzip war die Idee gut.
Das Problem von Ini-Dateien ist meiner Erfahrung nach die Beschränkung einer Zeile auf eine bestimmte Anzahl von Zeichen. Wird diese Beschränkung verletzt, so bricht die Zeile um und beim nächsten Auslesen hat man dann nur einen Bruchteil des eigentlichen Strings.

Die Größe der Inis ist glaube ich egal, jedenfalls bei TMemIniFiles.


hitstec - Mi 12.02.03 23:29

Ok @Popov. Das sehe ich ein.
Aber musst du gleich so gemein sein und meinen Screensaver nicht benutzen wollen? :(

:wink:


Anonymous - Mi 12.02.03 23:55

Es gibt viele tolle Programme die ich nicht benutze nur weil einige Sachen mir nicht gefallen. Die Gefahren die ich bei deinem Programm sehe hab ich oben beschrieben. Ich will nicht ins Internet nur weil ich mich verklickt habe. Aber tröste dich. Ich hatte einen Bildschirmschoner (Shareware die ich dann gekauft habe). Das Ding war genial. Was mich gestört hat war, daß man nur mit der ESC-Taste rauskamm. Alle anderen Tasten riefen eine Dialogbox die den Hinweis hatte, daß es eine Scharewareversion ist und man eben nur über ESC rauskommt. Also, weil mich das gestört hat und mir der Bildschirmschoner gefiell, hab ich die Software bezahlt und so freigeschaltet. Der Sharewarehinweis war weg, aber nicht das Dialogfenster. Anstelle des Sharewarehinweises war jetzt der Text, daß es eine registrierte Version ist und man immer noch über ESC rauskommt.

Trotz der 20DM die ich für das Programm bezahlt habe, hab ich den Bildschirmschoner nie wieder benutzt.

Du hast immer noch die Möglichkeit es zu verbessern ;)


Delete - Mi 12.02.03 23:58

[OFFTOPIC]
Du hättest wahrscheinlich jede Taste mit 20 Mark freischalten müssen. :mrgreen:
[/OFFTOPIC]


hitstec - Do 13.02.03 00:06

:roll: @Popov.

Gesagt getan.

Die Hotkeys sind nun an Strg gekoppelt. Und ein Warnhinweis vor dem Online gehen erscheint auch. Bis auf die Strg- und die Pause-Taste brechen alle anderen Tasten den Screensaver ab.

Ist das akzeptabel? Oder soll ich eine Option einbauen, die die Hotkeys ganz abschaltet?


hitstec - Do 13.02.03 00:18

Uuups, ein kleiner Bug ... behoben!


Anonymous - Do 13.02.03 00:44

Sehr gut! :D

Gefällt mir jetzt. Zwar werde ich die Tasten wahrscheinlich soweiso nicht nutzen, aber die Kombinationen:

Strg+A: Informationen zum Autor
Strg+K: Korrektur vorschlagen
Strg+T: Tell-A-Friend

funktionierten nicht. Ist mir nur so aufgefallen. Ansonsten finde ich die Abfrage gut.


hitstec - Do 13.02.03 01:09

Danke erstmal.

Die Hotkeys müssten jetzt hoffentlich endlich gehen. Bin so müde. Gehe jetzt ins Bett.

Danke euch beiden.


hitstec - Fr 14.02.03 19:33

So. Habe nun den Editor für eigene Zitate fertiggestellt. Man kann nun nur die Standardzitate, nur die eigenen Zitate oder beide anzeigen lassen.

@Luckie ist der Editor zufriedenstellend?


Raptor - Sa 15.02.03 21:15

Gefällt mir gut das Teil, werde es wohl weiter laufen lassen :lol:


RAPTOR


hitstec - Sa 15.02.03 21:19

Freut mich @Raptor. Ein paar nette Worte kann ich gut gebrauchen.
Danke.


City Light - Sa 22.02.03 22:04

Hallo hitstec

zu deinen Bildschirmschoner kann ich nur sagen hut ab! Meine frage die ich an dich richten möchte ist wie hast du das gemacht ?? das mit dem Label in deinen Schoner ,das ein buchstabe an denn anderen kommt das sieht echt geil aus .Könntest du mir nicht schreiben wie du das angestellt hast ?

Viele Grüße Tino


hitstec - Sa 22.02.03 22:58

Danke @City Light.

Im Prinzip ist die Technik ganz einfach. Das Grundgerüst für einen Bildschirmschoner habe ich sogar auf meiner Homepage im Archiv veröffentlicht.

Ich benutze für das Darstellen der Animationen Timer und While-Schleifen. Für die Darstellung der Schrift benutze ich natürlich kein Label, sondern zeichne direkt auf der Fläche.


Quelltext
1:
Canvas.TextOut...                    

Dabei zeichnet ein Timer, der auf 30 ms eingestellt ist, nach und nach die Schrift auf den Hintergrund. Bei jedem OnTimer-Durchlauf wird jeweils ein Buchstabe mehr gezeichnet als vorher - bis der komplette Text drin ist. So ergibt sich dieser Schreibmaschinen Effekt.
Bevor der Timer in Aktion tritt, werden allerdings die Schriftparameter errechnet. Nun das ist ein bißchen kompliziert, muss ich zugeben. Größe, Position, Auflösung und Stringlänge müssen dabei berücksichtigt werden.

Das eigentliche Interessante an dem Tool ist die integrierte Datenbank. Meine eigene Entwicklung, auf die ich sehr stolz bin. Funktioniert im Prinzip ähnlich wie MySQL-Database - stark vereinfacht natürlich.


City Light - Sa 22.02.03 23:46

das mit dem Timer bekom ich ja noch hin aber ich hab noch nie mit Canvas gearbeitet...kannst du nicht mal was posten oder per mail schicken? werd echt eine große hilfe.

Bei MySQL-Database kenn ich mich noch garnicht aus :( ,aber ich denke das was du da gemacht hast ist bestimmt nicht so einfach gewesen.

Viele Grüße Tino

PS:Das Grundgerüst für deinen Bildschirmschoner hab ich mir angesehen ,echt geil ..ich wußte vorher nie wie ich ein Bild im Vorschaufenster bekommen konnte dank dir :beer:


Raphael O. - Sa 22.02.03 23:50

City Light hat folgendes geschrieben:
ich wußte vorher nie wie ich ein Bild im Vorschaufenster bekommen konnte dank dir

Was kann er denn dafür, dass du das vorher nicht wusstest und warum bedankst du dich dafür?? :lol:
:wink: :wink: :wink:


City Light - Sa 22.02.03 23:56

ganz einfach an hand seines guten beispiels :wink:


Raphael O. - So 23.02.03 00:02

WAr nicht ernst gemeint von mir...

in deinem obigen Post hast du dich bei ihm dafür bedankt, dass du nicht wusstest wie man sowas macht...
Das meintest du wahrscheinlich aber nicht und das wollte ich nur sagen :lol:

Fiji-Fighter


hitstec - So 23.02.03 00:03

Hehe. :D

Na gut. Hier mal ein Bsp. Den Code benutze ich für den Titel.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TMyScreenSaverForm.DoFrame;
const TitelFontSize=24; ResolutionX=1024;
var c1: TCanvas; iInc: Integer; 
begin
 iInc:=1;
 repeat
  s1:=UpperCase(s1);
  c1:=TCanvas.Create;
  c1.Handle:=Canvas.Handle;
  with c1.Font do begin
   Style:=[fsBold];
   Color:=clGreen;
   Name:='Verdana';
   Size:=Ceil((TitelFontSize*(4/(iInc+3)))*(Self.Width/ResolutionX));
   if c1.TextWidth(s1)>Self.Width*(60/100) then Size:=Round((Size * 60 * Self.Width)/(100 * c1.TextWidth(s1)));
  end;

  iY:=(Height div 2)-((Abs(c1.Font.Height)) div 2);
  Inc(iInc);
 until iY>0;

 sDraw:=s1;
 iStep:=Length(sDraw);
 Canvas.Font:=c1.Font;
 ShowChar.Enabled:=true;
 while ShowChar.Enabled and bRunning do begin
  Application.ProcessMessages;
  sleep(1);
 end;

 c1.Free;
end;


s1,iStep,iY,sDraw sind globale Variablen. s1 ist der Text der gezeichnet werden soll.

Und so sieht bei mir das OnTimer-Event aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TMyScreenSaverForm.ShowCharTimer(Sender: TObject);
var iCenterX: Integer; sTmp: String;
begin
 Dec(iStep);
 sTmp:=Copy(sDraw,1,Length(sDraw)-iStep);
 iCenterX:=(Width div 2)-(Canvas.TextWidth(sTmp) div 2);
 Canvas.TextOut(iCenterX,iY,sTmp);
 if iStep<=0 then ShowChar.Enabled:=false;
end;


Falls du da durchsteigst, dann kann ich dir zeigen, wie man lange Strings automatisch umbrechen kann. :wink:


City Light - So 23.02.03 00:16

Danke dir ,werde das gleich mal ausprobieren *freu*

...wie man lange Strings automatisch umbrechen kann :eyecrazy:
werd drauf zurück kommen nur die frage ist wann *gg*

und zu Fiji-Fighter: schon ok ich hätte mich halt anders ausdrüken sollen ,nichts für ungut


City Light - So 23.02.03 00:47

Ich bekomm's nicht zum laufen :cry:
zeigt nur fehler an ,ich denke das in der uses klausel bmp rein muß oder?


Raphael O. - So 23.02.03 00:58

Welche Fehler kommen denn??
Eigentlich gehört das hier nicht ins Freeware-Forum ;)

Fiji-Fighter


City Light - So 23.02.03 01:05

ne ganze menge...

Fehler:
Undefinierter Bezeichner: 'Ceil' ,iy ,sDraw ,iStep
und noch ne ganze menge mehr..

ich weiß da nich weiter ,und wenn ich in der Uses klausel bmp einfüge kann delphi die dcu datei nicht finden *schnief*

gruß Tino


Raphael O. - So 23.02.03 01:11

Das liegt nicht an einer bmp-unit!!

Ceil ist eine function, was die macht weiß ich aber auch net :(

istep ist eine Integer Variable...

iy: Single;

sdraw:Integer;

Die musste alle im "Kopf" der unit deklarieren...


Aya - So 23.02.03 01:14

Ceil ist soweit ich weiß nur in der Math-Unit, also noch bei uses "Math" einbinden :) (und ne Unit "BMP" gibt es nich, brauchst also auchnet bei Uses hinschreiben)

Au'revoir,
Aya


City Light - So 23.02.03 01:23

Danke euch beiden ,aber es läuft trotzdem noch nich... :cry:
Vielleicht kann uns ja hitstec weiter helfen :?:


Aya - So 23.02.03 01:24

Hi,

du... dir kann keiner wirklich helfen wenn du sagst "Ich hab hier nen fehler, aber was für einen... neee... das sag ich euch nicht!! hrhr"... ;)

Deswegen, sag einfach mal was da genau für fehler sind.. (Zeile in Delphi Markieren STRG+C und hier einfach einfügen!)

Au'revoir,
Aya


hitstec - So 23.02.03 01:31

Korrekt.

Poste einfach eine genaue Fehlerbeschreibung, dann wird dir geholfen.

:wink:


City Light - So 23.02.03 01:31

Also gut :)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
iStep:=Length(sDraw); // Fehler: Inkompatible Typen

sTmp:=Copy(sDraw,1,Length(sDraw)-iStep);// Fehler: Inkompatible Typen

Canvas.TextOut(iCenterX,iY,sTmp);// Inkompatible Typen: Integer und Singel

s1:=UpperCase(s1); //Undefinierter Bezeichner: s1
while Form1.Timer1.Enabled and bRunning do begin //Undefinierter Bezeichner: bRunning


hitstec - So 23.02.03 01:38

Diese Variablen müssen global definiert werden. So könnte es aussehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public
    { Public-Deklarationen }
  end;

var Form1: TForm1;
     iStep: Integer; s1,sDraw: String; bRunning: Boolean;

implementation

{$R *.DFM}


Raphael O. - So 23.02.03 01:46

City Light hat folgendes geschrieben:
Also gut :)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
1. iStep:=Length(sDraw); // Fehler: Inkompatible Typen

2. sTmp:=Copy(sDraw,1,Length(sDraw)-iStep);// Fehler: Inkompatible Typen

3. Canvas.TextOut(iCenterX,iY,sTmp);// Inkompatible Typen: Integer und Singel

4. s1:=UpperCase(s1); //Undefinierter Bezeichner: s1

5. while Form1.Timer1.Enabled and bRunning do begin //Undefinierter Bezeichner: bRunning

zu 1.:sDraw muss ein String sein
zu 2.: -length(sdraw) klappt wieder net
zu 3.: "round(iy),round(sTmp)
zu 4.: du musst s1 als string deklarieren...


City Light - So 23.02.03 01:46

so sieht meine Unit aus


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls,Math;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    
  end;
var
  Form1: TForm1;
  Canvas : TCanvas;
  iStep: Integer; s1,sDraw: String; bRunning: Boolean;
  iy: Single;

implementation

{$R *.dfm}

procedure TMyScreenSaverForm.DoFrame;
const TitelFontSize=24; ResolutionX=1024; 
var c1: TCanvas; iInc: Integer; 
begin 
iInc:=1; 
repeat 
  s1:=UpperCase(s1); 
  c1:=TCanvas.Create; 
  c1.Handle:=Canvas.Handle; 
  with c1.Font do begin 
   Style:=[fsBold]; 
   Color:=clGreen; 
   Name:='Verdana'; 
   Size:=Ceil((TitelFontSize*(4/(iInc+3)))*(Self.Width/ResolutionX)); 
   if c1.TextWidth(s1)>Self.Width*(60/100) then Size:=Round((Size * 60 * Self.Width)/(100 * c1.TextWidth(s1))); 
  end; 

  iY:=(Height div 2)-((Abs(c1.Font.Height)) div 2); 
  Inc(iInc); 
until iY>0; 

sDraw:=s1; 
iStep:=Length(sDraw); 
Canvas.Font:=c1.Font; 
ShowChar.Enabled:=true; 
while ShowChar.Enabled and bRunning do begin 
  Application.ProcessMessages; 
  sleep(1); 
end; 

c1.Free; 
end;

procedure TForm1.Timer1Timer(Sender: TObject);
  var iCenterX: Integer; sTmp: String;
begin
Dec(iStep);
sTmp:=Copy(sDraw,1,Length(sDraw)-iStep);
iCenterX:=(Width div 2)-(Canvas.TextWidth(sTmp) div 2);
Canvas.TextOut(iCenterX,iY,sTmp);
if iStep<=0 then Form1.Timer1.Enabled:=false;
end;

end.


Hier die Fehler meldungen:
[Fehler] Unit1.pas(29): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(42): Undefinierter Bezeichner: 'Self'
[Fehler] Unit1.pas(42): Anweisung erforderlich, aber Ausdruck vom Typ 'Extended' gefunden
[Fehler] Unit1.pas(43): Operator oder Semikolon fehlt
[Fehler] Unit1.pas(43): 'THEN' erwartet, aber Bezeichner 'Width' gefunden
[Fehler] Unit1.pas(54): Undefinierter Bezeichner: 'ShowChar'
[Fehler] Unit1.pas(60): 'UNTIL' erwartet, aber 'END' gefunden
[Fehler] Unit1.pas(68): Inkompatible Typen: 'Integer' und 'Single'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Raphael O. - So 23.02.03 01:59

Du solltest Dir vielleicht erst mal mit einfacheren BSp. die Materie aneignen...

Denn was bringts dir, wenn du das jetzt so ans laufen kriegst und nichts wirklich verstehst??

Fiji-Fighter


City Light - So 23.02.03 02:02

ja werd ich machen danke ,aber last mich hier nich dum sterben jungs :) :wink:


Raphael O. - So 23.02.03 02:08

Wir doch nicht...


hitstec - So 23.02.03 19:34

Das funkt:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
unit Unit1;

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls,Math; 

type 
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure DoFrame;
  public
    { Public-Deklarationen }
    
  end; 
var 
  Form1: TForm1;
  Canvas : TCanvas; 
  iY,iStep: Integer; s1,sDraw: String; bRunning: Boolean;

implementation 

{$R *.dfm} 

procedure TForm1.DoFrame;
const TitelFontSize=24; ResolutionX=1024; 
var c1: TCanvas; iInc: Integer; 
begin 
iInc:=1; 
repeat 
  s1:=UpperCase(s1); 
  c1:=TCanvas.Create; 
  c1.Handle:=Canvas.Handle; 
  with c1.Font do begin 
   Style:=[fsBold]; 
   Color:=clGreen; 
   Name:='Verdana'; 
   Size:=Ceil((TitelFontSize*(4/(iInc+3)))*(Self.Width/ResolutionX)); 
   if c1.TextWidth(s1)>Self.Width*(60/100) then Size:=Round((Size * 60 * Self.Width)/(100 * c1.TextWidth(s1))); 
  end;

  iY:=(Height div 2)-((Abs(c1.Font.Height)) div 2);
  Inc(iInc); 
until iY>0;

sDraw:=s1; 
iStep:=Length(sDraw);
Canvas.Font:=c1.Font; 
Timer1.Enabled:=true;
while Timer1.Enabled and bRunning do begin
  Application.ProcessMessages;
  sleep(1); 
end;

c1.Free; 
end;

procedure TForm1.Timer1Timer(Sender: TObject);
  var iCenterX: Integer; sTmp: String;
begin 
Dec(iStep);
sTmp:=Copy(sDraw,1,Length(sDraw)-iStep); 
iCenterX:=(Width div 2)-(Canvas.TextWidth(sTmp) div 2); 
Canvas.TextOut(iCenterX,iY,sTmp);
if iStep<=0 then Form1.Timer1.Enabled:=false; 
end; 

procedure TForm1.FormCreate(Sender: TObject);
begin
 s1:='Das ist mein Text!';
 DoFrame
end;

end.


hitstec - Mo 03.03.03 19:25

So. Ab heute gibts neue Features im Zitate-Bildschimrschoner:

Zoom In/Out-Effekt
Editor Such- und Importfunktion


Version: 1.0.7.18


Was mich interessieren würde: Hat sich schon jemand mal die Editorfunktion des Bildschimrschoners angeschaut?