Autor Beitrag
TomWest
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 10.03.05 18:26 
Hallo, meine Frage als Newbie: Sitze schon Stunden, besser seit zwei Tagen an dem Problem.
Ein Beispiel dafür wie leicht Delphi ist... :-(
Warum nicht so eine BMP laden:
Canvas.Load (Screen, PosX,PosY, ‚C:\Bitmap.bmp’)

Stattdessen Formcreate, Application.Run,
Ich möchte Bitmaps/Banner auf der Form integrieren, habe Schnippets gesucht
und compiliert. Leider erscheint nicht mal die Showmessage(‘Create’) in der Procedure Form1.Create… die ich ergänzt habe. Nur meine leere Form. Die granit.BMP liegt definitv vor.


Problem 2:
Ich positioniere NICHT den Timer auf die Form, sondern schreibe Code aus dem Buch ab. Funktioniert AUCH NICHT und möchte meine Deklaration
Timer1:TTimer beim Compilieren entfernen. Ziehe ich den Timer auf die Form wird
erst gemeckert, das ich den Timer schon habe... grrrr....
Immer noch derselbe Mist mit Borland.
Natürlich funzt der Timer, wenn ich den Timer über die Form verwende.

Ich habe mich schon ganz dusselig gesucht. EFF EINS (Delphi Hilfe)
Ich weiss nicht mehr weiter!
Mit Visual Basic habe ich es vielleicht leichter...
Dank im voraus für Eure Antworten....

Der Code Zum Problem 1:
ausblenden volle Höhe 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:
unit Unit1;
interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Bitmap: TBitmap;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  showmessage('Create');
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile('C:\granit.BMP');
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  X, Y, W, H: LongInt;
begin
  with Bitmap do begin
    W := Width;
    H := Height;
  end;
  Y := 0;
  while Y < Height do begin
    X := 0;
    while X < Width do begin
      Canvas.Draw(X, Y, Bitmap);
      Inc(X, W);
    end;
    Inc(Y, H);
  end;
end;

end.


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 10.03.05 21:02 
Wieso positionierst du nicht einfach ein TImage auf das Form und lädst dort das Bitmap? So könntest du dein Bitmap sogar zur Designzeit schon laden...
Zitat:
Ein Beispiel dafür wie leicht Delphi ist...

Man kann es stets kompliziert machen. ;)
TomWest Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 11.03.05 07:16 
Vielen Dank. Dein Tip klappe auf Anhieb.
Mit TPaint und über Picture im Objektfenster konnte
ich meine Bitmap laden. Endlich...

Mein Problem ist:
Ich will über den Timer das Bild wechseln.
Also muss ich per Hand den Code ändern.
Ich habe aber nur eine leere Prozedur, das Bild ist in der Form.
Wie komme ich an den SourceCode ran? Über die *.dfm?

Das Problem mit Formcreate und Timer ist noch nicht gelöst.
Mit der Hand geschreiben funktioniert nicht bei mir.
Und bei Euch???
Ich will ein Tool schreiben, dass mir Units und Prozeduren
(Bearbeitung von Aufrufparameter, Wahl ob GUI oder Consolenprogramm,
Shareware oder Adware, Viruscheck, Logdateien, Bilder, Verlassen des
Programmens mit ESC, Internetupdate, etc.) optional anbietet.
Aber wenn ich z. B. Timer mit der Hand schreibe,
funktioniert es bei mir nicht. BUG in Delphi, Bug in meiner Konfiguration
oder verlange ich zuviel von Delphi einen von Hand geschrieben Timer zu übernehmen?

Mit Grüßen an die Community...

Tom West
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 11.03.05 09:06 
Also mal ganz zu zurück zum Anfang. Dein showmessage('Create'); wird nicht aufgerufen? Dann könnte es sein, dass du die Methode FormCreate von Hand in den Quellcode geschrieben hast? Wenn ja, dann kann es auch nicht gehen. So wäre die Methode lediglich eine Methode der Klasse. Die Klasse weiß aber nicht was sie damit anstellen soll. Im ObjectInsprector findest du den Reiter 'Ereignisse'. In dem findest du, bei deinem Formular, auch das Event OnCreate. Wenn du dort doppelt drauf klickst dann erstellt Delphi für dich eine Methode namens FormCreate und weißst sie intern der Eigenschaft zu. Das ist genau das was bei dir Wahrscheinlich nicht der Fall gewesen ist. Also zu Anfang immer schön über den ObjectInspektor arbeiten. Du kannst diese Eigenschaften auch Manuell aus dem Code zu weisen. Oder du wählst in der ComboBox eine Kompatible Methode aus.

Da wären wir dann schon beim Nächsten. Alles was du in der IDE machen kannst. Also über den ObjectInspector etc. kannst du auch im Quellcode machen. Du musst nur wissen was du machen musst. Wenn es nicht geht ist in deinem Code irgendwo einen Fehler.

Das Problem an deinem QuellCode ist der, dass sie nicht aufgerufen wurden. Eben durch den oben beschrieben Sachverhalt.

Evtl wäre es auch besser, wenn du dein Bitmap nicht als globale Variable sondern Bestandteil deines Fensters machst. Und natürlich musst du sie weider durch Bitmap.Free wieder frei geben wenn sie nicht mehr gebraucht werden. Sonst verschwendest du Speicher. Und bei einem Bitmap sogar reichlich!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Type
  TForm1 = class(TForm)
  private
    fBitmap: TBitmap;
  end;

Im Create verwendest dann anstelle von Bitmap einfach fBitmap. Und im OnClose des Forms solltest du es wieder frei geben.

PS: Das war eine kleine Exkursion in die Objekt orientierte Programmierung (OOP). Alles weitere kostet. ;-)

Zu deinem Bilderwelchsel Problem. Laut deinem Quellcode sehe ich, dass du das Bild nicht nur ein mal darstellen möchtest sondern gekachelt haben willst. Also solltest du dich von dem TImage trennen und es von Hand machen. Und in dem Timer müsstest du lediglich in das Bitmap ein neues Bitmap laden und dann Repaint aufrufen. Dadurch wird das Form veranlasst sich neu zu zeichnen.

PPS: Zum Kachen solltest folgender Code zum Zeichnen vollkommen ausreichen.
ausblenden Delphi-Quelltext
1:
2:
  Canvas.Brush.Bitmap := fBitmap;
  Canvas.FillRect (ClientRect);

Ja. Mehr braucht man nicht. Allerdings sobald man von dem Standardverhalten abweichen möchte dann muss man es selber programmieren. So wie du es ja bereits gemacht hast.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
TomWest Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 11.03.05 09:19 
HILFE!!!!

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:
23:
24:
25:
26:
27:
28:
29:
type
  TForm1 = class(TForm)
    Image1: TImage;
// Mit der Hand eingefügt:
   Procedure Create(Sender:TObject);
   procedure Image1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// Mit der Hand eingefügt!
Procedure Tform1.create(sender:Tobject);
begin
end;

procedure TForm1.Image1Click(Sender: TObject);
begin

end;

end.



Nach dem Compilieren entfernt der Compiler meine mit der Hand geschriebene Procedure
Procedure Tform1.create(sender:Tobject);
und die Declaration unter der (Class)


Kann mir jemand bitte weiterhelfen?
Danke!

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 11.03.05 09:28 
Nein! Nicht erst beim Compilieren sondern schon beim Speichern! Das ist in Delphi normal. Alle leeren Methoden du die OHNE Sichtbarkeit (Public, Protected, Private) erstellt hast gehören normalerweise zu Delphi und dem Sytsem was an den DFM's hängt. Das Verhalten kannst du nur ändern in dem du ihnen eine Sichtbarkeit zuweist oder etwas in die Methoden schreibst. Ein leerer Kommentar ( // ) reicht dabei vollkommen aus.

Hast du dir eigentlich meinen Beitag durchgelesen??? In dem habe ich groß und breit beschrieben, dass du die Methoden NICHT per Hand hinzufügen sollst, da sie nicht mit dem Formularevent OnCreate und Image.ObClick verbunden sind.
Außerdem ist ein Methode namens Create sehr gefährlich, da der Name nomalerweise zum Konstruktor gehört.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
TomWest Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 11.03.05 11:21 
Hallo, Lossy Ex!

Vielen Dank für Deine ausführliche Antwort!
Ich schrieb gerade an der nächsten Nachricht, daher die Überschneidung.
Melde mich heute Abend, setze Deine Tipps um.

Bis später!

Tom
TomWest Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 12.03.05 11:07 
Mensch, Lossy Ex,
ich schreibe permanent die Codes ab, oder lade Progamme und meinst Du, dass ich gedacht hätte in den „leeren Feldern“ (erst klickte ich 2x auf ONCREATE im Objektinspector – nichts tat sich!) :?
zweimal zu klicken? Ich denke, es geht/ging wohl einigen so. Statt Fahrrad fahre ich dank Dir nun Auto, Du hast mir viel Zeit gespart, und ich hänge nicht mehr 2 Tage (genaugenommen seit mehr als einem halben Jahr) :oops: an dem eigentlich so banalen Problem. Nochmals vielen DANK!!!!!!!!!!

Ich nehme natürlich Oncreate für die Prozeduren, die ich beim Starten des Programmes schon ausführen möchte und OnClose für die Proceduren die
beim schließen des Fensters bzw. des Programmes beendet werden. Jetzt geht es bei mir flotter.............................................

Tschau, bin am programmieren...(motiviert hoch 3)
:roll: