Autor |
Beitrag |
Jakane
Beiträge: 257
|
Verfasst: 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
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
Beiträge: 257
|
Verfasst: 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
|
Verfasst: Sa 29.08.15 19:25
Jakane hat folgendes geschrieben : | Kennt niemand das Problem, das Grafiken nicht richtig geladen werden? |
Also ich hatte noch niemals Probleme damit, daß Grafiken nicht geladen werden.
Jakane hat folgendes geschrieben : | 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.
Jakane hat folgendes geschrieben : | ich sehe wie sich die Kacheln von links nach rechts geladen werden... |
Ist doch schön, wenn man was sieht
Versuch doch mal, das Repaint wegzulassen und stattdessen am Ende, wenn alle Grafiken geladen sind, ein Appication.ProcessMessages ...
|
|
Jakane
Beiträge: 257
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 257
|
Verfasst: Sa 29.08.15 21:25
hathor hat folgendes geschrieben : |
Umlaute in einem Programm sind eine Vergewaltigung!
|
Sehr Hilfreich...
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
|
Verfasst: Sa 29.08.15 21:43
Ständig poppt ein Fenster auf: Server ist nicht erreichbar.
Solche Meldungen gehören in eine Statuszeile!
|
|
Jakane
Beiträge: 257
|
Verfasst: Sa 29.08.15 22:33
hathor hat folgendes geschrieben : | 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
|
Verfasst: Sa 29.08.15 23:22
Jakane hat folgendes geschrieben : | 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.
Jakane hat folgendes geschrieben : | Bei einer Prüfung über Canvas.Pixel kam eine Farbe von -1 raus... |
Ja und?
Jakane hat folgendes geschrieben : | 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
Beiträge: 257
|
Verfasst: So 30.08.15 07:53
_________________ Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 257
|
Verfasst: 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
|
Verfasst: 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
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 173
Erhaltene Danke: 43
|
Verfasst: 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:
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:
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.
|
|