Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Do 27.08.15 20:49 
Hallo liebe Delphi-Helfer :)

Ich habe auf meiner Form 81 TImages (Kacheln) und in einem Datenmodul zur Zeit 13 TImages in unterschiedlichen Farben.

Bei FormStart wird in jeder Kachel eines diese 13 Farb-Images geladen
Seltsamerweise bleiben bei jedem 2. Start Kacheln weiss / leer.
Die fehlenden Farben sind immer die selben pro Start.

Also mal sind alle Kacheln komplett, dann fehlen mal alle grünen, dann mal alle gelben und dann mal alle grauen und grüben ect.
Ein Muster konnte ich bisher nicht finden :(

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:
procedure TKarteAnzeige.Do_Aktualisieren;
var
  i, j, X, Y, HX, HY: Integer;
  cImage: TImage;
  cGelände: TGelände;
begin
  HX := FClientHaupt.X;
  HY := FClientHaupt.Y;
  for Y := HY - 4 to HY + 4 do
  begin
    for X := HX - 4 to HX + 4 do
    begin
      i := FGrafik.Kacheln[X, Y];
      cGelände := TGelände(DMKreta.Liste.Items[i]);
      j := ((Y - HY + 4) * 9) + (X - HX + 4);
      cImage := TImage(FClientHaupt.TKachelliste.Items[j]);
      if cImage.Tag <> i then
      begin
        cImage.Picture.Assign(cKachel.Grafik.Picture);
        cImage.Transparent := False;
        cImage.Tag := i;
      end;
    ...
  end;
end;


j ist der Index der Kachel in einer Objectlist und
i ist der Index des Farb-Image

Die Berechnung funktioniert, nur manchmal bleiben halt FarbKacheln weiss, obwohl ich den Code nicht änder :(

Jemand Rat?

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Sa 29.08.15 16:49 
Kennt niemand das Problem, das Grafiken nicht richtig geladen werden?

Inzwischen mach ich ein Repaint, dann sind alle Grafiken korrekt da, aber das dauert zu lange...
ich sehe wie sich die Kacheln von links nach rechts geladen werden...

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 29.08.15 19:25 
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Kennt niemand das Problem, das Grafiken nicht richtig geladen werden?

Also ich hatte noch niemals Probleme damit, daß Grafiken nicht geladen werden.

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Inzwischen mach ich ein Repaint, dann sind alle Grafiken korrekt da, aber das dauert zu lange...

Wenn ein Repaint Erfolg hat, dann kann es nicht am Laden liegen. Wie lange dauert denn dein Repaint? Machst du das etwa nach jeder Grafik? Dann wäre es allerdings kein Wunder, wenn du damit den Vorgang extrem verzögerst.

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
ich sehe wie sich die Kacheln von links nach rechts geladen werden...

Ist doch schön, wenn man was sieht :D

Versuch doch mal, das Repaint wegzulassen und stattdessen am Ende, wenn alle Grafiken geladen sind, ein Appication.ProcessMessages ...
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Sa 29.08.15 20:53 
Application.ProcessMessages; funktioniert leider auch nicht.

Bei einer Prüfung über Canvas.Pixel kam eine Farbe von -1 raus...
Habe versuch direkt über Canvas auf die Form zu zeichnen,
aber selbst da wird nicht alles gezeichnet, obwohl ich nur von x nach y gehe und einen grünen punkt setze...

Trotzdem Danke für die Idee.

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 29.08.15 21:11 
Mach doch mal ein richtiges Demo-Programm - mit dieser Procedure kann man nicht viel anfangen.

Umlaute in einem Programm sind eine Vergewaltigung!

Das hier gehört offensichtlich auch zum Programm:
www.entwickler-ecke....Client_114559,0.html
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Sa 29.08.15 21:25 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:

Umlaute in einem Programm sind eine Vergewaltigung!

Sehr Hilfreich...

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:

Das hier gehört offensichtlich auch zum Programm:
www.entwickler-ecke....Client_114559,0.html

Ja, das gehört zusammen, aber der Server sendet nur ein paar Zahlen und der Client malt demnach

Meine Daten sind im Anhang
Einloggen, um Attachments anzusehen!
_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 29.08.15 21:43 
Ständig poppt ein Fenster auf: Server ist nicht erreichbar.
Solche Meldungen gehören in eine Statuszeile!
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Sa 29.08.15 22:33 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Ständig poppt ein Fenster auf: Server ist nicht erreichbar.
Solche Meldungen gehören in eine Statuszeile!

Wenn der Server nicht gestartet und eingeschalten wurde ist der server nicht erreichbar

und auch dieser "Hinweis" ist nicht hilfreich zu meinem Problem... :(

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 29.08.15 23:22 
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Application.ProcessMessages; funktioniert leider auch nicht.

Was heißt "funktioniert leider auch nicht"? Selbstverständlich funktioniert Application.ProcessMessages! Vermutlich löst es nur nicht dein Problem.

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Bei einer Prüfung über Canvas.Pixel kam eine Farbe von -1 raus...

Ja und?

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Habe versuch direkt über Canvas auf die Form zu zeichnen, aber selbst da wird nicht alles gezeichnet, obwohl ich nur von x nach y gehe und einen grünen punkt setze...

Irgendwie klingt das alles ziemlich durcheinander ... 80 TImages auf der Form ... 13 TImages im Datenmodul ... wozu eigentlich TImages im Datenmodul? Dort kann man die sowieso nicht sehen.

Wie lädst du denn die Grafiken in die TImages?
Woher kommen die Grafiken?
Und da ich gerade beim Nachfragen bin: Wieso beantwortest du die Fragen, die ich dir bereits gestellt habe, nicht?

Ich frage ja nicht aus lauter Langeweile oder weil ich blöd bin, sondern weil ich damit dein Problem einzukreisen versuche.
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: So 30.08.15 07:53 
Ich dachte die Fragen vom letzten Post wären schon beantwortet gewesen, bzw. weiss ich keine Antwort

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Wie lange dauert denn dein Repaint?

Keine Ahnung, lange genug das es flackert

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Machst du das etwa nach jeder Grafik?

Muss ich ja wenn ich will das die Grafiken nicht weiss sind

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Bei einer Prüfung über Canvas.Pixel kam eine Farbe von -1 raus...

Ja und?

Sorry, ich dachte das könnte eine hilfreiche Info sein...

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:

Irgendwie klingt das alles ziemlich durcheinander ... 80 TImages auf der Form ... 13 TImages im Datenmodul ... wozu eigentlich TImages im Datenmodul? Dort kann man die sowieso nicht sehen.

Die 13 sind nur da um geladen zu werden, die 81 auf der Form bekommen eine der 13 zugewiesen

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:

Wie lädst du denn die Grafiken in die TImages?

Wo soll ich sie den sonst rein laden, wenn ich bunte 32x32 haben möchte? Delphi XE5 scheint nur TImages zu kennen.
Es gibt zwar auch TShape, aber darauf kann ich nicht zeichnen, was über ein bunten Quadrat (oder andere feste Formen) hinausgeht

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:

Woher kommen die Grafiken?
[/size]

Die sind schon wärend der Programmierung in den 13 TImages drin, habe dafür ein Bitmap gezeichnen und das Picture dann geladen

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 30.08.15 15:37 
Das ist alles ziemlich umständlich, was du da machst, werte Jakane. Wenn es sich um einfarbige Grafiken handelt, wäre es am sinnvollsten, diese Kacheln auf einem einzigen Canvas selbst zu zeichnen. Dafür benötigst du keine TImages im Datenmodul. Sollte es sich um 13 verschiedene Muster handeln, die du mit einem externen Mal- oder Grafikprogramm gezeichnet hast, kannst du diese Bitmaps (bmp, jpg ...) auch in die Ressourcendatei laden und dann im Programm die einzelnen Ressourcenbilder zeichnen. Damit wärst du das ganze Geflackere und all deine jetzigen Probleme ein für allemal los. Du zeichnest einfach im Speicher und weist das fertige Bitmap dann einfach dem Ziel-Canvas zu.
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: So 30.08.15 17:57 
Das mit dem Canvas auf meiner Hauptform habe ich versucht, aber auch dort bekam ich weisse Pixel obwohl ich von x bis y grün machen wollte :(

hab die selbe prozedur mal ohne TThread gemacht, geht problemlos...
scheinbar kann mein Thread das nicht richtig zeichnen

_________________
Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 30.08.15 19:59 
Wieso um alles in der Welt willst du von einem Thread aus auf die Canvas der Form malen? Da torpediert die Form ja unter Umständen die Zeichenbemühungen deines Threads, wenn sich die Form gerade neu zeichnet. Das macht doch überhaupt keinen Sinn :gruebel:
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 30.08.15 20:00 
Funktioniert eigentlich das Programm bei Irgendjemanden?

Diese Frage ist NICHT an Jakane gerichtet, denn ER/SIE/ES ist offensichtlich zu stur, um das Programm startfähig zu machen!
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mo 31.08.15 16:33 
Meiner Meinung nach macht es keinen Sinn in dieser Form weiter zu entwickeln.
Das Programm ist an vielen Stellen unnötig umständlich aufgebaut.
Grundsätzliche Fehler, insbesondere für Threads gilt:
- Zugriff auf VCL ist verboten
- Zugriff auf Grafik-Objekte ist verboten
- Zugriff auf Hauptthread ist verboten wenn nicht in geeigneter Form abgesichert
An vielen Stellen werden TImages erzeugt (aber nirgends freigegeben), obwohl eigentlich ein Verweis auf die bereits vorhandene Grafik genügt.
Zugriff auf globale Variablen bzw. Objekte aus Methoden anderer Objekte.
usw.

Irgendwann sollte man merken, dass man ein totes Pferd reitet und noch mal von vorn beginnen...

Es genügt doch eine TImageList um alle Kachelgrafiken einmal darin zu speichern.
Alle Objekte können per ImageIndex angeben, welche Grafik dargestellt werden soll.
Dann eine Paintbox, die die gesamte Darstellung übernimmt.
Im Prinzip vieleicht so:
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:
procedure TForm1.PaintBoxPaint(Sender: TObject);
begin
  ZeichneHintergrund(TPaintBox(Sender).Canvas);
  ZeichneVordergrund(TPaintBox(Sender).Canvas);
end;

procedure TForm1.ZeichneHintergrund(ACanvas: TCanvas);
var
  x, y: Integer;
begin
  for y := 0 to Zeilen - 1 do
    for x := 0 to Spalten - 1 do
      ZeichneKachel(ACanvas, x, y);
end;

procedure TForm1.ZeichneKachel(ACanvas: TCanvas; x, y: Integer);
var
  r: TPoint;
  n: Integer;
begin
  r := ErmittleKachelPosition(x, y);
  n := ErmittleKachelImageIndex(x, y);
  ImageListKacheln.Draw(ACanvas, r.x, r.y, n);
end;

Für frei positionierbare Vordergrundobjekte z.B. Spieler dann vieleicht noch eine Objektliste und eine zweite ImageListe,
insbesondere falls diese Grafiken eine andere Größe haben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.ZeichneVordergrund(ACanvas: TCanvas);
var
  i: Integer;
begin
  for i := 0 to FVordergrundList.Count - 1 do
    ZeichneObjekt(ACanvas, FVordergrundList[i]);
end;

procedure TForm1.ZeichneObjekt(ACanvas: TCanvas; AObject: TObject);
var
  r: TPoint;
  n: Integer;
begin
  r := ErmittleObjektPosition(AObject);
  n := ErmittleObjektImageIndex(AObject);
  ImageListObjekte.Draw(ACanvas, r.x, r.y, n);
end;

Threads sind für die Darstellung überflüssig, für zeitgesteuerte Bewegungen kann man einen Timer einrichten.