الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

how can i print codebarre

مغلق
بدأه FouFou في 27 يوليو 2005 · 2 رد · 3,618 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

hi

how i can send command file to printer ZEBRA TLP2844 connected with COM1 or TLP or USB

thanks.

<iframe id='a07f974d' name='a07f974d' src='http://www.islamway.com/phpAdsNew/adframe.php?n=a07f974d&what=zone:18&target=_blank' framespacing='0' frameborder='no' scrolling='no' width='468' hight='62' allowtransparency='true'><a href='http://www.islamway.com/phpAdsNew/adclick.php?n=a07f974d' target='_blank'><img src='http://www.islamway.com/phpAdsNew/adview.php?what=zone:18&n=a07f974d' border='0' alt=''></a></iframe>

شكوت الى وكيع سوء حفظي فأرشدني الى ترك المعاصي

وأخبرني بأن العلم نور ونور الله لا يؤتى لعاص

#2

السلام عليكم ...

^XA
^FO18,42^AA,22,16^FD@Name^FS
^FO30,80^BE,60^FD@barcode^FS
^FO120,170^AA,22,16^FD@Price^FS
^PQ@QTY
^XZ

كمثال على ملف أوامر طابعة زيبرا.

كما تلاحظ فقد أضفت @name أو @Price أو @QTY أو @Barcode البرنامج سوف يقوم بالبحث عن الكلمات التي تبدأ بالرمز @ و من ثم يقرأ ما بعدها حتى يصل إلى الرمز^

و من ثم يتم المقارنة مع قائمة أو مصفوفة لمعرفة ما هي البيانات التي سوف يتم وضعها مكان هذه الكلمات مثال

^FO120,170^AA,22,16^FDDhs.300.00^FS

هنا سوف يتم طباعة Dhs.300.00

فإذا كان لدينا عدد كبير من الباركود الذي نريد طباعته جدول المواد كاملا فما علينا إلا عمل حلقة كل مرة يتم فيها قراءة سجل و تبديل البيانات الموجودة فيه بالكلمات المفتاحية التي تبدأ ب@ (أنا اصطلحت ذلك لأني رأيته مريحا بالنسبة لي من الممكن استخدام أي رمز آخر) و من ثم يقوم البرنامج بإرسال ملف الاوامر إلى الطابعة بعد أن تم وضع البيانات من السجل الحالي فيه و هكذا.....

الموضوع الآخر هو كيف يتم الإرسال إلى الطابعة؟؟

طابعة الباركود عادة توصل بالمنفذ التفرعي LPT أو التسلسلي COM أو الناقل التسلسلي العام USB

طبعا التفرعي أسرع...

صراحة قمت بكتابة كومبوننت للتعامل مع المنفذ التسلسلي, أما التفرعي فهو بسيط للغاية و لا يحتاج أي كومبوننت أما USB فلم أنتهي من كتابة الكومبوننت الخاص به بعد.

وعادة ما أستخدم إجراء وحيد للطباعة أستدعيه كلما أردت إرسال شيء إلى الطابعة:

procedure BarcodePrint(pData: String);
Var  vPort : String;
begin
  vPort := vConfig_IF.ReadString('Barcode','PORT','');
  IF UpperCase(Copy(vPort,1,3)) = 'LPT' Then
  Begin
    LPTPRINT(pData,vPort);
  End Else
  IF UpperCase(Copy(vPort,1,3)) = 'COM' Then
  Begin
    COMMPRINT(pData,vPort);
  End;
end;

حيث أنه سنمرر ما نريد إرساله إلى الطابعة كنص ضمن الباراميتر و سوف نقرأ إعدادات المنفذ من الخارج أي من ملف INI. و كما ترى من خلال الكود سوف يختار الإجراء طلب الإجراء المناسب بحسب ماهية المنفذ.

سأبدأ بالأسهل و هو التفرعي LPT (LPTPRINT):

إن دلفي تتعامل مع الأجهزة و المنافذ كملفات و بالتالي سنفترض أن المنفذ التفرعي هو عبارة عن ملف سوف نفتحه و نكتب فيه و من ثم نغلقه.

procedure LPTPRINT(pData, pPort:String);
var  F: TextFile;
begin
  Try
    AssignFile(F,pPort);
    Rewrite(F);
    WriteLn(F,pData+#$0D);
  Finally
    CloseFile(F);
  End;
end;

أظن أن الكود واضح جدا ما عدا لماذا يتم تمرير القيمة #$0D مع البيانات, حيث أنه في بعض الأحيان يتم إرسال بعض البيانات و تبقى البيانات في البفر الخاص بالطابعة حتي هذا الأمر.

أما المنفذ التسلسلي COMM (COMMPRINT):

استدعاؤه بسيط لأن التعقيد مخبأ ضمن الكومبوننت الخاص بالتعامل مع المنفذ التسلسلي و ليس فيه.

procedure COMMPRINT(pData, pPort:String);
begin
  ComPortBarcodePrinter.Port := StrToInt(Copy(pPort,4,1));
  ComPortBarcodePrinter.Open;
  ComPortBarcodePrinter.WriteData(pData+#$0D);
  ComPortBarcodePrinter.Close;
end;

اختيار رقم المنفذ المناسب و من ثم فتح المنفذ إرسال البيانات ثم يتم إغلاقه.

أما عن الكومبوننت فهو مخصص لإرسال بيانات إلى المنفذ أو قراءة بيانات من المنفذ إلى البرنامج كمثال على ذلك أحيانا في مجال الطابعات هناك حساس يتحسس إذا قارب رول الورق على الإنتهاء و يرسل إشارات إلى المنفذ الموصل به أي من الطابعة إلى المنفذ حيث نستطيع قراءة الإشارات و إرسال رسائل تنبيه للمستخدم لتغيير رول الورق.

سوف أرفق السورس كود ما عليك إلا ان تنسخه إلى ملف نصي و تسميه نفس اسم اليونيت و تحفظه كملف باسكال.

unit ACommPort;

interface

uses
  SysUtils, Classes, Windows, ExtCtrls, Forms, Dialogs,
  Graphics, Controls, Buttons, StdCtrls;

type
  TACommPort = class(TComponent)
  private
     { Private declarations }
    FHandle: LongInt; {handle from OpenComm }
    FPort: Integer; { port #, 1-based }
    FBaud: LongInt; { baud rate }

    FRtsOn: boolean;
    FDtrOn: boolean;

    function IsOpen: Boolean;
    procedure SetBaud(BaudToSet: LongInt);
    procedure SetPort(PortToSet: Integer);
    procedure SetRtsOn(OnOff: boolean);
    procedure SetDtrOn(OnOff: boolean);
    function GetInCount: LongInt;
    function GetOutCount: LongInt;
  protected
    { Protected declarations }
  public
     { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Open: Boolean;
    function WriteByte(ch: byte): boolean;
    function WriteData(data:String): boolean;
    function ReadByte: byte;
    function ReadData(var data; size: integer): integer;
    procedure Flush;
    procedure Close;

  published
     { Published declarations }
    property Port: Integer read FPort write SetPort;
    property Baud: LongInt read FBaud write SetBaud;
    property InCount: LongInt read GetInCount;    // number of characters received
    property OutCount: LongInt read GetOutCount;   // number of characters pending on transmit
    property Active: Boolean read IsOpen;       // is port open
    property RtsOn: Boolean read FRtsOn write SetRtsOn;
    property DtrOn: Boolean read FDtrOn write SetDtrOn;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('A Component', [TACommPort]);
end;

// Component constructor
constructor TACommPort.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 // set default property values
 FHandle := INVALID_HANDLE_VALUE;
 FPort := 1;
 FBaud := 9600;
 FRtsOn  := false;
  FDtrOn := false;
end;

// Component destructor
destructor TACommPort.Destroy;
begin
 // close the com port (if open)
 Close;
 inherited Destroy;
end;

// Return True if port is open
function TACommPort.IsOpen: Boolean;
begin
 Result := (FHandle <> INVALID_HANDLE_VALUE);
end;

// Set the baud rate property
procedure TACommPort.SetBaud(BaudToSet: LongInt);
begin
 if BaudToSet <> FBaud then
 begin
   FBaud := BaudToSet;
   // if port is open, then close it and then reopen it
   // to reset the baud rate
   if IsOpen then
   begin
     Close;
     Open;
   end;
 end;
end;

// Set the Port property
procedure TACommPort.SetPort(PortToSet: Integer);
begin
 if PortToSet <> FPort then
 begin
  FPort := PortToSet;
  // if port was open, then close and reopen it
  if IsOpen then
   begin
    Close;
    Open;
   end;
 end;
end;

procedure TACommPort.SetRtsOn(OnOff: boolean);
begin
 FRtsOn := OnOff;
 if IsOpen then
  begin
     if OnOff then
       EscapeCommFunction(FHandle, SETRTS)
      else
       EscapeCommFunction(FHandle, CLRRTS);
  end;
end;

procedure TACommPort.SetDtrOn(OnOff: boolean);
begin
 FDtrOn := OnOff;
 if IsOpen then
  begin
     if OnOff then
       EscapeCommFunction(FHandle, SETDTR)
      else
       EscapeCommFunction(FHandle, CLRDTR);
  end;
end;

// Opens the COM port, returns True if ok
function TACommPort.Open: Boolean;
var
 sCom: String;
 dcbPort: TDCB;  // device control block
begin

  // close port if open already
  if IsOpen then Close;

  // try to open the port
  sCom := 'COM' + IntToStr(FPort);
  FHandle := CreateFile(PChar(sCom), GENERIC_READ or GENERIC_WRITE, 0,
                        nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, LongInt(0));

  // set the baud rate and other parameters
  IF FHandle <> INVALID_HANDLE_VALUE then
  Begin
//    IF GetCommState(FHandle, dcbPort) then
    GetCommState(FHandle, dcbPort);
    Begin
      // fill in the fields of the structure
      dcbPort.BaudRate := FBaud;
      dcbPort.ByteSize := 8;
      dcbPort.Parity := NOPARITY;
      dcbPort.StopBits := ONESTOPBIT;
      dcbPort.Flags := 0;
      { flag bit fields:
      dcb_Binary, dcb_Parity, dcb_OutxCtsFlow, dcb_fOutxDsrFlow,
      dcb_fOutX, dcb_fInX, dcb_DtrFlow, dcb_RtsFlow
      }
      SetCommState(FHandle, dcbPort);
    End;
    SetRtsOn(FRtsOn);
    SetDtrOn(FDtrOn);
  End;

  // return True if port opened
  Result := IsOpen;
end;

// Close the COM port
procedure TACommPort.Close;
begin
 if IsOpen then
   begin
    CloseHandle(FHandle);
   FHandle := INVALID_HANDLE_VALUE;
    end;
end;

// Write a char out the COM port
function TACommPort.WriteByte(ch: byte): boolean;
var
 dwCharsWritten: DWord;
begin
 dwCharsWritten := 0;
 if IsOpen then
  begin
   WriteFile(FHandle, ch, sizeof(ch), dwCharsWritten, nil);
  end;
  Result := dwCharsWritten = sizeof(ch);
end;

function TACommPort.WriteData(data:String): boolean;
var
 dwCharsWritten: DWord;
begin
 dwCharsWritten := 0;
 if IsOpen then
  begin
   WriteFile(FHandle,PChar(data)^, Length(Data), dwCharsWritten, nil);
  end;
  Result := dwCharsWritten = Length(Data);
end;

// Reads a character from the port
function TACommPort.ReadByte: byte;
var
 cbCharsAvailable, cbCharsRead: DWord;
 ch: byte;
begin
 ch := Ord(' ');
 if IsOpen then
  begin
      cbCharsAvailable := GetInCount;
      if cbCharsAvailable > 0 then
        begin
          ReadFile(FHandle, ch, sizeof(ch), cbCharsRead, nil);
        end;
  end;
  result := ch;
end;

function TACommPort.ReadData(var data; size: integer): integer;
var
 cbCharsAvailable, cbCharsRead: DWord;
begin
 cbCharsRead := 0;
 if IsOpen then
  begin
      cbCharsAvailable := GetInCount;
      if cbCharsAvailable > 0 then
        begin
         if cbCharsAvailable < size then
           size := cbCharsAvailable;
          ReadFile(FHandle, data, size, cbCharsRead, nil);
        end;
  end;
  result := cbCharsRead;
end;

// Return the number of bytes waiting in the input queue
function TACommPort.GetInCount: LongInt;
var
 statPort: TCOMSTAT;
 dwErrorCode: DWord;
begin
 Result := 0;
 if IsOpen then
  begin
   ClearCommError(FHandle, dwErrorCode, @statPort);
   Result := statPort.cbInQue;
  end;
end;

// Return the number of bytes waiting in the output queue
function TACommPort.GetOutCount: LongInt;
var
 statPort: TCOMSTAT;
 dwErrorCode: DWord;
begin
 Result := 0;
 if IsOpen then
  begin
   ClearCommError(FHandle, dwErrorCode, @statPort);
   Result := statPort.cbOutQue;
  end;
end;

// Flush the port by reading any characters in the queue
procedure TACommPort.Flush;
begin
 if FHandle <> INVALID_HANDLE_VALUE then
  begin
     FlushFileBuffers(FHandle);
   //PurgeComm(FHandle, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
  end;
end;

end.

بس ينتهي الكومبوننت الخاص باليو إس بي سوف أشرحه

الشام الله حاميها...

أنا الدمشقيُّ.. لو شرحتمُ جسدي

لسـالَ منهُ عناقيـدٌ.. وتفـّاحُ

و لو فتحـتُم شراييني بمديتكـم

سمعتمُ في دمي أصواتَ من راحوا

مآذنُ الشّـامِ تبكـي إذ تعانقـني

و للمـآذنِ.. كالأشجارِ.. أرواحُ

#3

السلام عليكم

شكرا لك على المساعدة

سأحاول

وأخبرك بالجديد

<iframe id='a07f974d' name='a07f974d' src='http://www.islamway.com/phpAdsNew/adframe.php?n=a07f974d&what=zone:18&target=_blank' framespacing='0' frameborder='no' scrolling='no' width='468' hight='62' allowtransparency='true'><a href='http://www.islamway.com/phpAdsNew/adclick.php?n=a07f974d' target='_blank'><img src='http://www.islamway.com/phpAdsNew/adview.php?what=zone:18&n=a07f974d' border='0' alt=''></a></iframe>

شكوت الى وكيع سوء حفظي فأرشدني الى ترك المعاصي

وأخبرني بأن العلم نور ونور الله لا يؤتى لعاص

هذا الموضوع مغلق.

مواضيع مشابهة