Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bitoperationen (https://www.delphipraxis.net/158544-bitoperationen.html)

Dunkelbunt27 23. Feb 2011 17:26

AW: Bitoperationen
 
Hallo,

:-D Ich muss mich aber doch nochmal melden.
Ich habe mir nun Bits angelegt um die Farben von Text zu steuern, zum testen.
Aber es funktioniert noch nicht....
Es sieht bis jetzt so aus:
Delphi-Quellcode:
type
TBuchstabe = record
               Zeichen : char;
               Attribut : byte;
             end;
...
 const
  flschwarz = 1;                   //Geändert!
  flblau   = 2;
  flrot    = 4;
  flgruen  = 8;
  flgrau   = 16;
...
var
  buchstabe      : array of array of TBuchstabe;
...
procedure TForm1.schwarzClick(Sender: TObject);
begin
 buchstabe[PositionSpalte,PositionZeile].attribut:= $FF shr 7 shl 7;   //1. Bit setzen
    //Andere Farbbits ausschalten
    if buchstabe[PositionSpalte,PositionZeile].attribut and flblau > 0 then
        buchstabe[PositionSpalte,PositionZeile].attribut :=
           buchstabe[PositionSpalte,PositionZeile].attribut and not flblau;
end;
...
procedure TForm1.blauClick(Sender: TObject);
begin
   buchstabe[PositionSpalte,PositionZeile].attribut:= $FF shr 7 shl 6;   //2. Bit setzen
    //Andere Farbbits ausschalten
    if buchstabe[PositionSpalte,PositionZeile].attribut and flgruen > 0 then
        buchstabe[PositionSpalte,PositionZeile].attribut :=
           buchstabe[PositionSpalte,PositionZeile].attribut and not flgruen;

    if buchstabe[PositionSpalte,PositionZeile].attribut and flrot > 0 then
        buchstabe[PositionSpalte,PositionZeile].attribut :=
           buchstabe[PositionSpalte,PositionZeile].attribut and not flrot;

    if buchstabe[PositionSpalte,PositionZeile].attribut and flgrau > 0 then
        buchstabe[PositionSpalte,PositionZeile].attribut :=
           buchstabe[PositionSpalte,PositionZeile].attribut and not flgrau;
end;
...
procedure buchstaben;                                                    
var i,n : integer;
begin
  for i := 1 to AnzahlSpalten do
    for n := 1 to AnzahlZeilen do
       begin    // Bit Abfragen
          if (buchstabe[i,n].Attribut and flschwarz > 0) then
             Form1.Canvas.Font.Color:=clblack;

          if (buchstabe[i,n].Attribut and flblau > 0) then
             Form1.Canvas.Font.Color:=clblue;

          if (buchstabe[i,n].Attribut and flrot > 0) then
             Form1.Canvas.Font.Color:=clred;

          if (buchstabe[i,n].Attribut and flgruen > 0) then
             Form1.Canvas.Font.Color:=clgreen;

          if (buchstabe[i,n].Attribut and flgrau > 0) then
             Form1.Canvas.Font.Color:=clgray;

        Form1.Canvas.TextOut(spalten[i],zeilen[n],buchstabe[i,n].zeichen);
       end;
end;
Ich hoffe das reicht um mein Problem nachzuvollziehen.

FG Dunkelbunt

DeddyH 23. Feb 2011 17:34

AW: Bitoperationen
 
Zitat:

Delphi-Quellcode:
buchstabe[PositionSpalte,PositionZeile].attribut:= $FF shr 7 shl 7;

Schau einmal, was Du hier tust: Du verschiebst 255 um 7 Stellen nach rechts, so dass 1 dabei herauskommt. Diese 1 verschiebst Du nun wieder um 7 Stellen nach links, Resultat ist dann 128. D.h. alle von 128 abweichenden Flags sind garantiert nicht gesetzt, so dass sich der anschließende Code erübrigt. Übrigens musst Du nicht abfragen, ob ein Flag gesetzt ist, wenn Du es "entsetzen" möchtest (falsch ist das aber auch nicht).

Dunkelbunt27 23. Feb 2011 17:39

AW: Bitoperationen
 
Ähm, ...

Wie kann ich das denn sonst machen ich hatte mir gedacht:
$FF = 11111111
1111 1111 shr 7 = 0000 0001 shl 5 = 0010 000
Dann habe ich an der 3. Stelle ein Bit

...
FG Dunkelbunt

DeddyH 23. Feb 2011 17:42

AW: Bitoperationen
 
Delphi-Quellcode:
Attribut := $20; //oder die entsprechende Konstante
[edit] Mir fällt gerade auf, dass Dein $16 nicht richtig ist, das muss entweder einfach 16 oder $10 heißen. [/edit]

Dunkelbunt27 23. Feb 2011 20:25

AW: Bitoperationen
 
Es funktioniert immernoch nicht :cry:

Delphi-Quellcode:
procedure TForm1.blauClick(Sender: TObject);
begin
   buchstabe[PositionSpalte,PositionZeile].attribut:= $20;   //2. Bit setzen
end;

procedure TForm1.schwarzClick(Sender: TObject);
begin
    buchstabe[PositionSpalte,PositionZeile].attribut:= $1;   //1. Bit setzen
end;

procedure buchstaben;                                                    // Vorbereitung für das schnelle anzeigen von Buchstaben
var lauf,i,n : integer;
begin
  for i := 1 to AnzahlSpalten do
    for n := 1 to AnzahlZeilen do
       begin    // Bit Abfragen
          if (buchstabe[i,n].Attribut and flschwarz > 0) then
             Form1.Canvas.Font.Color:=clblack;

          if (buchstabe[i,n].Attribut and flblau > 0) then
             Form1.Canvas.Font.Color:=clblue;

          if (buchstabe[i,n].Attribut and flrot > 0) then
             Form1.Canvas.Font.Color:=clred;

          if (buchstabe[i,n].Attribut and flgruen > 0) then
             Form1.Canvas.Font.Color:=clgreen;

          if (buchstabe[i,n].Attribut and flgrau > 0) then
             Form1.Canvas.Font.Color:=clgray;

        Form1.Canvas.TextOut(spalten[i],zeilen[n],buchstabe[i,n].zeichen);
       end;
end;

const
  flschwarz = $1;              
  flblau   = $20;
  flrot    = $36;
  flgruen  = 8;
  flgrau   = 16;

TBuchstabe = record
               Zeichen : char;
               Attribut : byte;
             end;

  buchstabe      : array of array of TBuchstabe;
Was mache ich falsch....
...

Aphton 23. Feb 2011 21:19

AW: Bitoperationen
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1083896)
Delphi-Quellcode:
buchstabe[PositionSpalte,PositionZeile].attribut:= $20;   //2. Bit setzen
buchstabe[PositionSpalte,PositionZeile].attribut:= $1;   //1. Bit setzen
Was mache ich falsch...

*Facepalm

Per $ gibt man in Delphi anstatt Dezimalwerte Hexwerte ein. Diese haben die Basis 16, anstatt 10.

$10 (Hex) = 16 (Dez).
$20 (Hex) = 32 (Dez).

Und jetzt kommts... DAS - HAT - NICHTS - MIT - BITS - ZU - TUN

Sir Rufo 24. Feb 2011 01:48

AW: Bitoperationen
 
Zitat:

Zitat von Aphton (Beitrag 1083921)
Und jetzt kommts... DAS - HAT - NICHTS - MIT - BITS - ZU - TUN

Aber im Computer hat doch alles was mit Bits zu tun :stupid:

Aphton 24. Feb 2011 02:08

AW: Bitoperationen
 
Ich wusste, dass diese Antwort kommt.

Relativ gesehen nicht. Also er hat sich ja dabei gedacht, dass das einzelne Bits präsentiert.

Nochmal zum Problem:
Code:
Bit 1 = 00000001 = 1   (Dezimal) = $01 (Hexadezimal)
Bit 2 = 00000010 = 2   (Dezimal) = $02 (Hexadezimal)
Bit 3 = 00000100 = 4   (Dezimal) = $04 (Hexadezimal)
Bit 4 = 00001000 = 8   (Dezimal) = $08 (Hexadezimal)
Bit 5 = 00010000 = 16  (Dezimal) = $10 (Hexadezimal)
Bit 6 = 00100000 = 32  (Dezimal) = $20 (Hexadezimal)
Bit 7 = 01000000 = 64  (Dezimal) = $40 (Hexadezimal)
Bit 8 = 10000000 = 128 (Dezimal) = $80 (Hexadezimal)
Diese Folge kann man auch als eine 2er Potenz anschreiben:
2^0, 2^1, 2^2, 2^3, 2^4, 2^5, 2^6, 2^7, ...

Edit: Ach übrigens, warum verwendest du nicht einfach mein kleines Record um die Einzelnen Bits zu setzen?
Delphi-Quellcode:
// Ersetze folgendes
type
TBuchstabe = record
               Zeichen : char;
               Attribut : byte;
             end;

// mit das hier:
type
TBuchstabe = record
               Zeichen : char;
               Attribut : TBitByte;
             end;

DeddyH 24. Feb 2011 07:51

AW: Bitoperationen
 
Gibt es einen bestimmten Grund dafür, dass man nicht einfach TColor nimmt?

implementation 24. Feb 2011 11:36

AW: Bitoperationen
 
Zitat:

Zitat von DeddyH (Beitrag 1083985)
Gibt es einen bestimmten Grund dafür, dass man nicht einfach TColor nimmt?

TColor = Cardinal :gruebel:

Wieso kommst du jetzt auf TColor?
So viele Bits braucht er doch gar nicht ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz