Funktion lässt keine Buchstaben zu

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

Hi Zusammen,

jetzt bin wieder an einem Punkt wo ich nicht weiterkomme.
Ich möchte einen Barcode mit folgendem Code generieren. Das scheint auch zu funktionieren, solange der Wert einer Zahl entspricht.
Buchstaben nimmt er nicht an..
Muss man die Funktion anders deklarieren ?

Code: Alles auswählen

function Barcode128_generieren(Barcode: String): String;
var
  x, y, fehlzeichen, checksumme : Integer;
  XBarcode : String;
  Zeichensatz: array[0..106] of string = (' ', '!', Chr(34), '#', '$', '%', '&', '''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î');
 
begin
  // Barcode GENERIEREN -------------------------------------------------------------------------------------------------------------------------------------------------LKW_Barcode
    If (length(Barcode) > 40) Then
     begin
       XBarcode := IntToStr(length(Barcode) - 40);
       ShowMessage('
Der zu codierende Text ist um ' + XBarcode + ' Zeichen zu lang. Um Fehler beim Scannen des Barcodes zu vermeiden, ist dieses auf 40 Zeichen begrenzt.');
       Exit;
      End;
 
  If (length(Barcode) = 0) Or (Barcode = '
') Then
      begin
       Exit;
      End;
 
  If pos ('
ß',Barcode) > 0 then
      begin
        ShowMessage('
Das Zeichen ß kann nicht dargestellt werden.');
        Exit;
      End;
   checksumme := 104;
 
   //Prüfziffer berechnen
 
        For x := 1 To Length(Barcode) do
        fehlzeichen := 1;
 
          For y := 0 To 106 do
 
            If StrtoInt(MidStr(Barcode, x, 1)) = y Then
            begin
              fehlzeichen := 0;
              checksumme := checksumme + (x * y);
            end;
 
          If fehlzeichen = 1 Then
            begin
              ShowMessage('
Das Zeichen ' + MidStr(Barcode, x, 1) + ' kann nicht dargestellt werden.');
              Exit;
            End;
 
  checksumme := checksumme Mod 103;
 
  result := '
Ì' + Barcode + Zeichensatz[checksumme] + 'Î';
  end;


P.s. diesen Code benutzte ich noch zu VBA Zeiten.. schwierig genug für mich ihn in Pascal zu übersetzen. :mrgreen:
Vorab danke für eure Hilfe. Lg Bernie

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Funktion lässt keine Buchstaben zu

Beitrag von shokwave »

Hallo,

ich hab eigentlich nur eine Gegenfrage. Könntest du nicht die barcode.pas nutzen? Die liegt im Lazarusverzeichnis unter components\lazreport\source.
Hab ein kleines Beispielprojekt gemacht(da liegt auch schon alles drin).
Dateianhänge
project1.zip
minibeispiel barcode.pas
(136.5 KiB) 155-mal heruntergeladen
mfg Ingo

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

Hi shokwave, ui das ist in jedem Fall hilfreich, aber vermutlich nur ein Teil den ich benötige.

Damit unsere Scanner den Barcode auch lesen können, benötigt der Barcode Text eine Prüfziffer.
Mein Code berechnet die Prüfziffer.Code 128 verwendet ein einfaches Modulo 103 Prüfziffernverfahren.
Die Prüfziffer wird aus dem Array gelesen und mit angefügt.

Wird diese damit auch errechnet oder ist das nur die Darstellung von C128 A oder B?
Lg Benrie

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

@Shockwave ok scheint mit drin zu sein klasse ! Hätte ich mir die Grübelei auch ersparen können hehe

Wie installiert man sowas sauber ? Sorry bin echt noch im Umgang mit Lazerus Anfänger LG Bernie

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Funktion lässt keine Buchstaben zu

Beitrag von gocher »

Code: Alles auswählen

 
        For x := 1 To Length(Barcode) do
        begin //<<<<
          fehlzeichen := 1;
 
          For y := 0 To 106 do
          begin //<<<<
 
            If StrtoInt(MidStr(Barcode, x, 1)) = y Then
            begin
              fehlzeichen := 0;
              checksumme := checksumme + (x * y);
            end;
            If fehlzeichen = 1 Then
            begin
              ShowMessage('Das Zeichen ' + MidStr(Barcode, x, 1) + ' kann nicht dargestellt werden.');
              Exit;
            End;
         end; // <<<<
      end; //<<<<
 

ich würde sagen auf jeden Fall ein paar begin/end vergessen
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

@gocher danke für die Info.. .aber warum meckert er dann eigentlich nicht ? hmm komisch.
habe das jetzt nachgetragen..
Er lässt aber immer noch keine Buchstaben zu.

Liegts vielleicht daran wie ich die Funktion aufrufe ?

Code: Alles auswählen

 Barcode.text := Barcode128_generieren(Bezeichnung.text);

Ich checks nicht :D
Danke für eure Hilfe !! Lg Bernie

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

ich denke ich weiss jetzt an was es liegt.

Code: Alles auswählen

 
            If StrtoInt(MidStr(Barcode, x, 1)) = y Then
            begin
              fehlzeichen := 0;
              checksumme := checksumme + (x * y);
            end;


Dieser CodeSchnipsl ist falsch übersetzt.
In VBA sieht er so aus :

Code: Alles auswählen

 
 
If (Mid(Barcode, x, 1) = Zeichensatz(y)) Then
 
fehlzeichen = 0
 
checksumme = checksumme + (x * y)
 
Exit For
 
End If


das ist das Problem : If (Mid(Barcode, x, 1) = Zeichensatz(y)) Then die Mid Funktion

Gibts eine Funktion in Pascal die ähnlich wie die Mid-VBA Funktion funktioniert ?
Habe im NEtz gefunden dass es eventuell mit copy geht.

Code: Alles auswählen

        If (copy(Barcode, x, 1) = Zeichensatz[y]) Then
        begin
          fehlzeichen := 0;
          checksumme := checksumme + (x * y);
        end


Funzt aber leider auch nicht :( Will doch eigentlich nur jedes einzelne Zeichen mit dem Array vergleichen

vll hilf auch der Komplette VBA Code ..

Code: Alles auswählen

Public Function Barcode128_generieren(Barcode)
 
Dim x, y, fehlzeichen, checksumme
 
Dim Zeichensatz As Variant
 
Zeichensatz = Array(' ', '!', Chr(34), '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î')
 
Barcode128_generieren = ""
 
If (Len(Barcode) > 40) Then
  x = MsgBox("Der zu codierende Text ist " & Str(Len(Barcode) - 40) & " Zeichen zu lang." & Chr(13) & "Um Fehler beim Scannen des Barcodes zu vermeiden, ist dieses Makro auf 40       
 Zeichen begrenzt.", 64, "Barcode-Generator (Code 128)")
 Exit Function
End If
  
If (Len(Barcode) = 0 Or Barcode = "0") Then
 Exit Function
End If
  
If (InStr(Barcode, "ß") <> 0) Then
 x = MsgBox("Das Zeichen ß kann nicht dargestellt werden.", 64, "Barcode-Generator (Code 128)")
 Exit Function
End If
 
checksumme = 104
  
Barcode = Replace(Barcode, " ", "ß")
  
For x = 1 To Len(Barcode)
 
   fehlzeichen = 1
 
     For y = 0 To 94
 
     If (Mid(Barcode, x, 1) = Zeichensatz(y)) Then
         fehlzeichen = 0
        checksumme = checksumme + (x * y)
        Exit For
    End If
 
Next y
 
     If fehlzeichen = 1 Then
       x = MsgBox("Das Zeichen " & Mid(Barcode, x, 1) & " kann nicht dargestellt werden.", 64, "Barcode-Generator (Code 128)")
      Exit Function
    End If
Next x
  
checksumme = checksumme Mod 103
 
Barcode128_generieren = "Ì" & Barcode & Zeichensatz(checksumme) & "Î"
 
End Function


Vll hat ja jemand noch eine Idee. Wäre nett. Danke + Lg Bernie

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Funktion lässt keine Buchstaben zu

Beitrag von gocher »

Code: Alles auswählen

for x := 1 to Length(Barcode) do
begin
  fehlzeichen := 1;
  for y := 0 to 106 do
  begin
    if Barcode[x] = Zeichensatz[y] then
    begin
      fehlzeichen := 0;
      checksumme := checksumme + (x * y);
      break;
    end;
  end;
  if fehlzeichen = 1 then
  begin
    ShowMessage('Das Zeichen ' + Barcode[x] + ' kann nicht dargestellt werden.');
    exit;
  end;
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

gocher hat geschrieben:

Code: Alles auswählen

for x := 1 to Length(Barcode) do
begin
  fehlzeichen := 1;
  for y := 0 to 106 do
  begin
    if Barcode[x] = Zeichensatz[y] then
    begin
      fehlzeichen := 0;
      checksumme := checksumme + (x * y);
      break;
    end;
  end;
  if fehlzeichen = 1 then
  begin
    ShowMessage('Das Zeichen ' + Barcode[x] + ' kann nicht dargestellt werden.');
    exit;
  end;
end;


Hi Gocher, danke für deine Hilfe & Mühe,
in dieser Zeile : Barcode[x] = Zeichensatz[y] then
soll folgendes passieren :
Wenn ich z.b. folgenden Text habe : ABAR2
Dann ist der erste Buchstabe A ----- und nun benötige ich den Index Wert aus dem Array A = Zeichensatz[index] sollte 34 sein wenn ich mich nicht verzählt habe.
Mit (copy(Barcode, x, 1) bekomme ich auch den Wert A --- nur liesst er keinen Wert aus..

Sorry das ich mich so dämlich anstelle.. aber wie kann man den Indexwert aus diesem Array auslesen wenn ich den Buchstaben A habe ? :oops:

Lg Bernie

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Funktion lässt keine Buchstaben zu

Beitrag von Winni »

Hi!

Du must dir ne kleine Function bauen, die die array Werte abklappert:

Code: Alles auswählen

function  ArrayWert (s: string) : integer;
var i : integer;
 
begin
result := -1;
for i := low(Zeichensatz) to high(Zeichensatz) do
  begin
  if Zeichensatz[i] = s then
     begin
      result := i;
      exit;
     end;
   end; // for
end;
 


Wenn das Zeichen nicht gefunden wurde gib es -1 zurück, sonst den Wert.
Du solltest also abfragen

Code: Alles auswählen

if ArrayWert('A') >= 0 then .....
 


Winni

PS.: Du solltest das als Unterfunction von Deiner Procedure integrieren, also hinter der Definition von "Zeichensatz" und vor dem ersten "begin".

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Funktion lässt keine Buchstaben zu

Beitrag von Bernie110 »

@ Winni herzlichen Dank, jetzt hab ichs hinbekommen !

Antworten