Entwickler-Ecke

Multimedia / Grafik - Senkrechte Laufschrift in Delphi


No0B - Fr 02.04.10 12:23
Titel: Senkrechte Laufschrift in Delphi
Guten, immer noch mein Problem mit der senkrechten laufschrift in Delphi.

Hab ne externe txt Datei die ich gerne anzeigen lassen möchte habs mit nem string (TStrinvaluelist) versucht Timer und label sind drin. Funzt aber net.
Vielleicht hat ja jemand etwas in der Richtung gemacht und hat nen Code für mich.

Geht das auch ohne string ? Nur mit Timer und Label?

Hier mal der Code:


Delphi-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:
79:
80:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls, MMSystem, MPlayer, Buttons, WebAdapt,
  WebComp ;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    StringsValuesList1: TStringsValuesList;
    procedure Button1Click(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses main;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin
close;
end;


//Fenster verschieben
 procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ReleaseCapture;
 Perform(WM_SYSCOMMAND, $F0120);
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
 Label1.Top := Label1.Top - 30

end;

//Fenster verschieben
  //ausfaden
 type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Form2.AlphaBlend:=True; //Alphablend einschalten
  Form2.AlphaBlendValue:=Form1.AlphaBlendValue - 5;
  if Form2.AlphaBlendValue = 0 then Close; //Programm nach ausfaden schließen
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Jakob_Ullmann - Fr 02.04.10 13:26

Es kann auch gar nicht funktionieren, weil dein Code völliger Schwachsinn ist. Das kommt davon, wenn man alles zusammenkopiert. Ansonsten bitte ich darum, dass du "funzt net" etwas genauer beschreibst, also evtl. Fehlermeldung von Delphi sowie Soll- und Ist-Verhalten des Programms.

Die Frage kann man nur beantworten, wenn du genau beschreibst, was du vor hast. Grundsätzlich kann man mit einem Label nur eine Zeile anzeigen. Diese kann zwar umbrochen werden, aber es können keine eigenen Zeilenumbrüche gesetzt werden.

Eine Lösung wäre zum Beispiel, ein Memo zu bewegen. Oder für jede Zeile ein Label und dann alles bewegen, aber ich weiß nicht, in wie weit du dich schon mit OOP befasst hast.

Übrigens: Bitte fasse deinen Code in [delphi] statt [code]-Tags

Hier mal eine Idee, wie man es ungefähr machen könnte:


Delphi-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:
const
  STEP_WIDTH = 5;

var
  zeile: array[0..2of string;
  y: Integer = 20;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True; // DoubleBuffering, damit kein Flackern entsteht
  zeile[0] := 'Ein';
  zeile[1] := 'kleiner Text';
  zeile[2] := 'zum Ausgeben...';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Byte;  // mehr als 256 Zeilen wirst du ja wohl nicht haben ;-)
begin
  inc(y, STEP_WIDTH);  // dasselbe wie y := y + STEP_WIDTH
  Canvas.Rectangle(00, ClientWidth - 1, ClientWidth - 1);
  for i := 0 to 2 do
    Canvas.TextOut(20, y + (Canvas.TextHeight('X') + 3) * i, zeile[i]);
end;


Das kann man dann noch mit dynamischen Arrays oder eben Stringlisten machen.


delphi10 - Fr 02.04.10 18:01

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Es kann auch gar nicht funktionieren, weil dein Code völliger Schwachsinn ist. Das kommt davon, wenn man alles zusammenkopiert. Ansonsten bitte ich darum, dass du "funzt net" etwas genauer beschreibst, also evtl. Fehlermeldung von Delphi sowie Soll- und Ist-Verhalten des Programms.

Die Frage kann man nur beantworten, wenn du genau beschreibst, was du vor hast. Grundsätzlich kann man mit einem Label nur eine Zeile anzeigen. Diese kann zwar umbrochen werden, aber es können keine eigenen Zeilenumbrüche gesetzt werden.


Seit wann kann ein Label nur eine Zeile anzeigen?

Delphi-Quelltext
1:
Label1.Caption := 'blalalalala' + #13#10 + 'qqqqqqqqq';                    

Ed: #13+#10 ist ein bewußt gesetzter Zeilenumbruch.
Also bei mir geht das.


No0B - Fr 02.04.10 18:37

Das bringt mir aber nix, da die textfile auch ascii art enthällt. Wäre also net schlecht wenns schon formartiert angezeigt wird.


elundril - Fr 02.04.10 18:46

und? brauchst ja nur die ascii-art in eine Stringliste zu laden und die dann zeilenweise mit dem #10#13 in dein label rüberkopieren. wobei natürlich es eleganter wäre wenn du deinen Text in eine Stringlist einliest und dann selbst zeichnen würdest auf eine paintbox zb.

lg elundril


Jakob_Ullmann - Sa 03.04.10 14:11

user profile icondelphi10: Komisch, hatte das so in Erinnerung, dass das bei Labels nicht ging. Dann wäre das natürlich einfach.

NnoOB: Wo ist das Problem? Wie es aussieht, interpretiert das Label ja #13#10 korrekt und sollte damit doch alles darstellen können, was sich so in einer Textdatei befindet.