// Es kann eine sogenannte "Punktschrift" erstellt werden
// unter Verwendung kleiner Bildchen. In Beispiel mit
// einem Herzchen. Der Einfachheit halber werden Umlaute
// und "ß" umgewandelt. Neben Ziffern und Buchstaben werden
// auch das Plus- und Minuszeichen unterstützt sowie Punkt,
// Doppelpunkt, Komma und Klammern. Es dürfte leicht sein ein
// anderes Zeichen auch noch einzuarbeiten.
// Querverweis:
eine Punktschrift erstellen
 

Beispiel 1 Beispiel 2



// Getestet mit RS 10.4 unter Win11
 

type 
  Range = 3 .. 25; 
 
const 
  Wide = 4; // 5 = 0..4 
  Altitude = 6; // 7 = 0..6 
 
var 
  Bitmap: TBitmap; 
  arr: Array [0 .. Wide, 0 .. Altitude] of Boolean; 
  Actively, Inactive: TColor; 
  DiameterW, DiameterH: Range; 
 
procedure Dots(Cnv: TCanvas; X, Y, B: Integer); 
var 
  I, W, H, GW, GH, X1, X2, Y1, Y2: Integer; 
begin 
  I := Succ((DiameterW + DiameterH) Div 20); 
  with Cnv do 
  begin 
    for H := 0 to Altitude do 
      for W := 0 to B do 
      begin 
        GW := DiameterW + I; 
        GH := DiameterH + I; 
        X1 := X + W * GW; 
        Y1 := Y + H * GH; 
        X2 := X1 + DiameterW; 
        Y2 := Y1 + DiameterH; 
        if arr[W, H] = False then 
        begin 
          Brush.Color := Inactive; 
          Fillrect(Rect(X1, Y1, X2, Y2)); 
        end 
        else 
          Cnv.Draw(X1, Y1, Bitmap); 
      end; 
  end; 
end; 
 
procedure Horz(X, L, R: Integer; C: Boolean); 
var 
  I: Integer; 
begin 
  for I := L to R do 
    arr[I, X] := C; 
end; 
 
procedure Vert(X, T, B: Integer; C: Boolean); 
var 
  I: Integer; 
begin 
  for I := T to B do 
    arr[X, I] := C; 
end; 
 
function Letter(S: Integer): Integer; 
  procedure Blank(B: Integer); 
  var 
    I: Integer; 
  begin 
    for I := 0 to B do 
      Vert(I, 0, Altitude, False); 
  end; 
  procedure V1(I, J, K: Integer); 
  begin 
    Vert(I, J, K, true); 
  end; 
  procedure H2(I, J, K: Integer); 
  begin 
    Horz(I, J, K, true); 
  end; 
 
var 
  I: Integer; 
begin 
  Result := Succ(Wide); 
  case S of 
    40: // Klammer auf 
      begin 
        Blank(Wide - 3); 
        V1(0, 1, Altitude - 1); 
        arr[1, 0] := true; 
        arr[1, Altitude] := true; 
        Result := Wide - 2; 
      end; 
    41: // Klammer zu 
      begin 
        Blank(Wide - 3); 
        V1(1, 1, Altitude - 1); 
        arr[0, 0] := true; 
        arr[0, Altitude] := true; 
        Result := Wide - 2; 
      end; 
    43: // + 
      begin 
        Blank(Wide); 
        V1(2, 1, Altitude - 1); 
        H2(3, 0, Wide); 
      end; 
    45: // - 
      begin 
        Blank(Wide - 1); 
        H2(3, 0, Wide - 1); 
        Result := Wide; 
      end; 
    46: // Punkt 
      begin 
        Blank(Wide - 4); 
        arr[0, Altitude] := true; 
        Result := Wide - 3; 
      end; 
    58: // Doppelpunkt 
      begin 
        Blank(Wide - 4); 
        arr[0, 3] := true; 
        arr[0, 5] := true; 
        Result := Wide - 3; 
      end; 
    44: // Komma 
      begin 
        Blank(Wide - 3); 
        arr[0, Altitude] := true; 
        arr[1, Altitude - 1] := true; 
        Result := Wide - 2; 
      end; 
    48, 79: // 0, O 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude - 1); 
        V1(Wide, 1, Altitude - 1); 
        H2(0, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        if S = 48 then 
          Vert(2, 2, 4, true); 
      end; 
    49: // 1 
      begin 
        Blank(Wide - 2); 
        V1(1, 0, Altitude - 1); 
        H2(Altitude, 0, 2); 
        arr[0, 1] := true; 
        Result := Wide - 1; 
      end; 
    50: // 2 
      begin 
        Blank(Wide); 
        H2(0, 1, Wide - 1); 
        arr[0, 1] := true; 
        V1(Wide, 1, 2); 
        H2(Altitude, 0, Wide); 
        for I := 1 to Wide - 1 do 
          arr[I, Altitude - I] := true; 
      end; 
    51: // 3 
      begin 
        Blank(Wide); 
        H2(0, 1, Wide - 1); 
        arr[0, 1] := true; 
        V1(Wide, 1, 2); 
        H2(3, 2, 3); 
        H2(Altitude, 1, Wide - 1); 
        Vert(Wide, Altitude - 2, Altitude - 1, true); 
        arr[0, Altitude - 1] := true; 
      end; 
    52: // 4 
      begin 
        Blank(Wide); 
        H2(4, 0, Wide); 
        V1(2, 3, Altitude); 
        for I := 0 to 2 do 
          arr[I, 2 - I] := true; 
        arr[0, 3] := true; 
      end; 
    53: // 5 
      begin 
        Blank(Wide - 1); 
        H2(0, 0, Wide - 1); 
        V1(0, 1, 2); 
        arr[0, Altitude - 1] := true; 
        H2(Altitude, 1, Wide - 2); 
        V1(Wide - 1, Altitude - 3, Altitude - 1); 
        H2(2, 1, Wide - 2); 
        Result := Wide; 
      end; 
    54: // 6 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude - 1); 
        H2(0, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        V1(Wide, Altitude - 3, Altitude - 1); 
        H2(2, 1, Wide - 1); 
      end; 
    55: // 7 
      begin 
        Blank(Wide - 1); 
        H2(0, 0, Wide - 1); 
        for I := 0 to Wide - 1 do 
          arr[I, Altitude - I - 1] := true; 
        arr[Wide - 1, 1] := true; 
        arr[0, Altitude] := true; 
        arr[0, 1] := true; 
        Result := Wide; 
      end; 
    56: // 8 
      begin 
        Blank(Wide); 
        H2(0, 1, Wide - 1); 
        H2(3, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        Vert(0, 1, 2, true); 
        V1(0, Altitude - 2, Altitude - 1); 
        V1(Wide, 1, 2); 
        V1(Wide, Altitude - 2, Altitude - 1); 
      end; 
    57: // 9 
      begin 
        Blank(Wide); 
        H2(0, 1, Wide - 1); 
        H2(3, 1, Wide - 1); 
        V1(0, 1, 2); 
        V1(Wide, 1, Altitude - 1); 
        H2(Altitude, 1, Wide - 1); 
      end; 
    65: // A 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude); 
        V1(Wide, 1, Altitude); 
        H2(0, 1, Wide - 1); 
        H2(3, 1, Wide - 1); 
      end; 
    66: // B 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        H2(0, 0, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        H2(3, 1, Wide - 1); 
        V1(Wide, 1, 2); 
        V1(Wide, 4, Altitude - 1); 
      end; 
    67: // C 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude - 1); 
        H2(0, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        arr[Wide, 1] := true; 
        arr[Wide, Altitude - 1] := true; 
      end; 
    68: // D 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        H2(0, 1, Wide - 2); 
        H2(Altitude, 1, Wide - 2); 
        arr[Wide - 1, 1] := true; 
        arr[Wide - 1, Altitude - 1] := true; 
        V1(Wide, 2, Altitude - 2); 
      end; 
    69: // E 
      begin 
        Blank(Wide - 1); 
        V1(0, 0, Altitude); 
        H2(0, 1, Wide - 1); 
        H2(3, 0, Wide - 2); 
        H2(Altitude, 1, Wide - 1); 
        Result := Wide; 
      end; 
    70: // F 
      begin 
        Blank(Wide - 1); 
        V1(0, 0, Altitude); 
        H2(0, 1, Wide - 1); 
        H2(3, 1, Wide - 2); 
        Result := Wide; 
      end; 
    71: // G 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude - 1); 
        H2(0, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        V1(Wide, Altitude - 3, Altitude - 1); 
        H2(3, 2, Wide - 1); 
        arr[Wide, 1] := true; 
      end; 
    72: // H 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        V1(Wide, 0, Altitude); 
        H2(3, 1, Wide - 1); 
      end; 
    73: // I 
      begin 
        Blank(Wide - 2); 
        V1(1, 1, Altitude - 1); 
        H2(0, 0, 3); 
        H2(Altitude, 0, 3); 
        Result := Wide - 1; 
      end; 
    74: // J 
      begin 
        Blank(Wide - 1); 
        V1(Wide - 1, 0, Altitude - 1); 
        H2(Altitude, 1, Wide - 2); 
        V1(0, Altitude - 2, Altitude - 1); 
        Result := Wide; 
      end; 
    75: // K 
      begin 
        Blank(Wide - 1); 
        V1(0, 0, Altitude); 
        for I := 1 to Wide - 1 do 
          arr[I, 3 - I] := true; 
        for I := 1 to Wide - 1 do 
          arr[I, I + 3] := true; 
        Result := Wide; 
      end; 
    76: // L 
      begin 
        Blank(Wide - 1); 
        V1(0, 0, Altitude); 
        H2(Altitude, 1, Wide - 1); 
        Result := Wide; 
      end; 
    77: // M 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        V1(Wide, 0, Altitude); 
        for I := 1 to 2 do 
          arr[I, I] := true; 
        arr[3, 1] := true; 
      end; 
    78: // N 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        V1(Wide, 0, Altitude); 
        for I := 1 to 2 do 
        begin 
          arr[I, I] := true; 
          arr[I + 1, I + 2] := true; 
        end; 
      end; 
    80, 82: // P, R 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude); 
        H2(0, 0, 3); 
        H2(3, 1, 3); 
        V1(Wide, 1, 2); 
        if S = 82 then 
        begin 
          for I := 2 to Wide do 
            arr[I, I + 2] := true; 
        end; 
      end; 
    81: // Q 
      begin 
        Blank(Wide); 
        V1(0, 1, Altitude - 1); 
        V1(Wide, 1, Altitude - 2); 
        H2(0, 1, Wide - 1); 
        for I := Wide - 2 to Wide do 
          arr[I, I + 2] := true; 
        H2(Altitude, 1, 2); 
      end; 
    83: // S 
      begin 
        Blank(Wide); 
        H2(0, 1, Wide - 1); 
        H2(3, 1, Wide - 1); 
        H2(Altitude, 1, Wide - 1); 
        V1(0, 1, 2); 
        V1(Wide, 4, Altitude - 1); 
        arr[0, Altitude - 1] := true; 
        arr[Wide, 1] := true; 
      end; 
    84: // T 
      begin 
        Blank(Wide); 
        H2(0, 0, Wide); 
        V1(2, 1, Altitude); 
      end; 
    85: // U 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude - 1); 
        V1(Wide, 0, Altitude - 1); 
        H2(Altitude, 1, Wide - 1); 
      end; 
    86: // V 
      begin 
        Blank(Wide); 
        V1(0, 0, 3); 
        V1(1, 4, 5); 
        V1(Wide, 0, 3); 
        V1(Wide - 1, 4, 5); 
        arr[2, Altitude] := true; 
      end; 
    87: // W 
      begin 
        Blank(Wide); 
        V1(0, 0, Altitude - 1); 
        V1(Wide, 0, Altitude - 1); 
        arr[1, Altitude] := true; 
        arr[Wide - 1, Altitude] := true; 
        V1(2, Altitude - 3, Altitude - 1); 
      end; 
    88: // X 
      begin 
        Blank(Wide); 
        V1(0, 0, 1); 
        V1(Wide, 0, 1); 
        V1(0, Altitude - 1, Altitude); 
        V1(Wide, Altitude - 1, Altitude); 
        for I := 1 to Wide - 1 do 
          arr[I, I + 1] := true; 
        arr[1, Altitude - 2] := true; 
        arr[3, 2] := true; 
      end; 
    89: // Y 
      begin 
        Blank(Wide); 
        V1(0, 0, 2); 
        V1(Wide, 0, 2); 
        arr[1, Altitude - 3] := true; 
        arr[3, Altitude - 3] := true; 
        V1(2, Altitude - 2, Altitude); 
      end; 
    90: // Z 
      begin 
        Blank(Wide); 
        H2(0, 0, Wide); 
        H2(Altitude, 0, Wide); 
        for I := 0 to Wide do 
          arr[I, Altitude - Succ(I)] := true; 
      end; 
  else // Space 
    begin 
      Blank(Wide - 1); 
      Result := Wide; 
    end; 
  end; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Bitmap := TBitmap.create; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  FreeAndNil(Bitmap); 
end; 
 
procedure TForm1.Scripture(Txt: String; Cnv: TCanvas; X, Y: Integer); 
var 
  I, D, DD, DDD, XX, YY: Integer; 
begin 
  XX := X; 
  DDD := X; 
  I := Succ((DiameterW + DiameterH) Div 20); 
  YY := (DiameterH + I) * (Altitude + 2); 
  Txt := AnsiUppercase(StringReplace(Txt, 'ß', 'SS', [rfReplaceAll])); 
  Txt := StringReplace(Txt, 'Ä', 'AE', [rfReplaceAll]); 
  Txt := StringReplace(Txt, 'Ö', 'OE', [rfReplaceAll]); 
  Txt := StringReplace(Txt, 'Ü', 'UE', [rfReplaceAll]); 
  for I := 1 to length(Txt) do 
  begin 
    D := Letter(Ord(Txt[I])); 
    DD := DiameterW * D + Round(DiameterW * 1.5); 
    inc(DDD, DD); 
    if DDD > Cnv.cliprect.Right then // Zeilenumbruch 
    begin 
      X := XX; 
      DDD := XX; 
      inc(Y, YY); 
    end; 
    Dots(Cnv, X, Y, D - 1); 
    inc(X, DD); 
  end; 
end; 
 
 
 
// ------ Beispiel1 ------- 
 
procedure Load; 
var 
  C: TColor; 
  function ChangeColor(bmp: TBitmap; oldc, newc: TColor): Boolean; 
  var 
    n: array [0 .. 2] of Byte; 
    R, g, B: Byte; 
    X, Y, z, b3: Integer; 
    p: PBytearray; 
  begin 
    Result := False; 
    newc := colortorgb(newc); 
    oldc := colortorgb(oldc); 
    n[2] := getrvalue(newc); 
    n[1] := getgvalue(newc); 
    n[0] := getbvalue(newc); 
    R := getrvalue(oldc); 
    g := getgvalue(oldc); 
    B := getbvalue(oldc); 
    bmp.pixelformat := pf24bit; 
    b3 := bmp.width * 3; 
    for Y := 0 to bmp.Height - 1 do 
    begin 
      p := bmp.scanline[Y]; 
      X := 0; 
      while X < b3 do 
      begin 
        if (p[X] = B) and (p[X + 1] = g) and (p[X + 2] = R) then 
        begin 
          for z := 0 to 2 do 
            p[X + z] := n[z]; 
          Result := true; 
        end; 
        inc(X, 3); 
      end; 
    end; 
  end; 
 
begin 
  Bitmap.LoadFromFile('Herz.bmp'); 
  C := Bitmap.Canvas.Pixels[0, 0]; // z.B. 
  ChangeColor(Bitmap, C, Form1.Color); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Actively := $D00000; 
  Inactive := Color; 
  Load; 
  DiameterW := Bitmap.width; 
  DiameterH := Bitmap.Height; 
  Scripture('Delphi', Canvas, 30, 10); 
end; 
 
 
// ------ Beispiel2 ------- 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  Actively := $AF0000; 
  Inactive := $FFE0E0; 
  Bitmap.width := 5; 
  Bitmap.Height := 5; 
  DiameterW := Bitmap.width; 
  DiameterH := Bitmap.Height; 
  with Bitmap.Canvas do 
  begin 
    Brush.Color := Inactive; 
    Fillrect(cliprect); 
    Brush.Color := Actively; 
    Pen.Color := Actively; 
    Ellipse(0, 0, DiameterW, DiameterH); 
  end; 
  Scripture('Test 123', Canvas, 30, 100); 
end;
// --- P.S. ---
// Wer nicht nur Strings ausgeben will, sondern den Text
// buchstabenweise eintippen möchte findet in Punkt.rtf
// eine entsprechende Anregung.


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke