// Sie kennen bestimmt das Darstellen von Zahlen durch stricheln:
// Es werden 4 senkrechte Striche nebeneinander gesetzt und 1 Strich
// schräg über die vier senkrechte Striche ausgeführt, wodurch sogenannte
// Fünfer-Blöcke entstehen. Diese Blöcke ergeben dann durch Auszählen
// und Multiplizieren mit 5 die Gesamtzahl der Striche.
// Die folgende Prozedur kann aus einer vorgegebenen Zahl eine solche
// Strichliste generieren und mittels
TBitmap darstellen.

// Erläuterung der Parameter:

Strichliste(
Zahl,       
 // Word (darzustellende Zahl)
MaxZahl,     
// Word (höchste darzustellende Zahl, bestimmt die Höhe der Bitmap)
B,           
// TBitmap (darauf wird die Strichliste dargestellt)
Waagerecht, 
 // Byte    (maximale Zahl der waagerecht darzustellenden Blöcke)
Hoehe,      
 // Byte    (Länger der Striche und damit die Höhe eines Blocks)
Blockabstand,
// Byte    (Abstand der Fünfer-Blöcke zueinander)
Stift,       
// TColor  (Farbe der Striche)
Papier,     
 // TColor  (Farbe der Untergrundes)
Fuzzy,      
 // Boolean (False = gerade Striche; True = Freihand-Striche)
Transpa)    
 // Boolean (bestimmt ob ein Untergrund angezeigt wird oder nicht)

// Getestet mit D4 unter WinME

Gerade Striche
(siehe Button9)
Freihand-Striche
(siehe Button10)
procedure Strichliste(zahl, maxzahl: word; b: TBitmap; waagerecht, hoehe, 
  blockabstand: byte; stift, papier: TColor; fuzzy, transpa: boolean); 
var 
  blockzahl, gblockzahl, senkrecht, gsenkrecht, abstand, abzug, 
    i, j, k, f1, f2: integer; 
  procedure f1f2; 
  begin with b.canvas do begin 
      f1 := random(2) * pen.width * ord(fuzzy); 
      f2 := random(2) * pen.width * ord(fuzzy); 
    end; 
  end; 
  procedure block(x, y, z: integer); 
  var 
    w: integer; 
  begin 
    with b.canvas do begin 
      for w := 0 to z - 1 - ord(z = 5) do begin 
        f1f2; 
        moveto(x + w * abstand + abstand + f2, y + abstand + f1); 
        lineto(x + w * abstand + abstand + f1, y + hoehe + abstand + f2); 
      end; 
      if z = 5 then begin 
        f1f2; 
        moveto(x - pen.width * 2 + abstand, y + hoehe - 1 + f1 * 2); 
        lineto(x + 4 * abstand + pen.width * 2, 
          y + hoehe - abstand * 2 - 1 + f2 * 2); 
      end; 
    end; 
  end; 
begin 
  if hoehe < 8 + ord(fuzzy) * 4 then hoehe := 8 + ord(fuzzy) * 4; 
  if blockabstand < 2 then blockabstand := 2; 
  inc(maxzahl, ord(maxzahl = 0)); 
  if maxzahl < zahl then maxzahl := zahl; 
  blockzahl := (zahl div 5) + ord(zahl mod 5 > 0); 
  gblockzahl := (maxzahl div 5) + ord(maxzahl mod 5 > 0); 
  if gblockzahl < waagerecht then waagerecht := gblockzahl; 
  inc(waagerecht, ord(waagerecht = 0)); 
  senkrecht := (blockzahl div waagerecht) + ord(blockzahl mod waagerecht > 0); 
  gsenkrecht := (gblockzahl div waagerecht) 
    + ord(gblockzahl mod waagerecht > 0); 
  abstand := (hoehe div 4) + ord(hoehe div 4 = 0); 
  abzug := 5 - (zahl mod 5); 
  if abzug = 5 then abzug := 0; 
  with b do begin 
    height := (hoehe + abstand div 2) * gsenkrecht + abstand * 2 
      + (gsenkrecht - 1) * blockabstand - abstand div 2; 
    with canvas do begin 
      pen.width := hoehe div 10 + ord(hoehe div 10 = 0); 
      brush.color := papier; 
      pen.color := stift; 
      width := hoehe * waagerecht + abstand + pen.width * 2 
        + (waagerecht - 1) * blockabstand; 
      fillrect(cliprect); 
      if zahl > 0 then begin 
        for j := 0 to senkrecht - 1 do 
          for i := 0 to waagerecht - 1 do begin 
            k := j * waagerecht + i; 
            if k < blockzahl then 
              block(i * hoehe + i * blockabstand + abstand div 2, 
                j * hoehe + j * (blockabstand + abstand div 2), 
                5 - abzug * ord(k = blockzahl - 1)); 
          end; 
      end; 
    end; 
    transparent := transpa; 
  end; 
end; 
 
 
// --- Beispielaufrufe --- 
 
// Sofort-Anzeige mit geraden Strichen 
procedure TForm1.Button9Click(Sender: TObject); 
var 
  bm: TBitmap; 
begin 
  bm := TBitmap.create; 
  Strichliste(83, 83, bm, 5, 20, 12, clyellow, clblack, false, false); 
  canvas.draw(5, 5, bm); 
  bm.free; 
end; 
 
// Langsamer Aufbau mit gekritzelten Strichen 
procedure TForm1.Button10Click(Sender: TObject); 
var 
  bm: TBitmap; 
  maxzahl: word; 
  x: integer; 
begin 
  maxzahl := 83; 
  bm := TBitmap.create; 
  for x := 1 to maxzahl do begin 
    randseed := maxzahl; 
    Strichliste(x, maxzahl, bm, 5, 20, 12, clyellow, clblack, true, false); 
    canvas.draw(5, 5, bm); 
    sleep(100); 
    if x mod 5 = 0 then sleep(50); 
  end; 
  bm.free; 
end;


Zugriffe seit 6.9.2001 auf Delphi-Ecke