Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [DELPHI .NET] StrPcopy per .NET

    Ciao, ho trovato (grazie Alka) una funzione che mi permette di mandare delle sequenze di escape alla stampante. Il problema è che l'esempio che ho io è per win 32 e logicamente alcune funzioni non girano con Delphi.net.
    in particolare la StrPcopy. Qualcuno sa darmi qualche idea su come sostituirla? Grazie.
    codice:
    type TPrnBuffRec = record
        BuffLength : word;
        Buffer : Array [0..255] of char;
    end
    
    var F : TextFile;
    var Str : string;
    
    Procedure PrintLine(s : string);
      var Buff : TPrnBuffRec;
          TestInt : Integer;
      begin
      TestInt := PASSTHROUGH;
      if Escape(Printer.Handle, QUERYESCSUPPORT, sizeof(TestInt), @TestInt, nil ) > 0 then
        begin
          Printer.BeginDoc;
          s := #27 + 'W1'+ 'A test string ' + #27 + #10 + ' Ciao Ciao';
          StrPCopy(Buff.buffer, s); 
          Buff.BuffLength := StrLen(Buff.buffer);
          Escape(Printer.Canvas.Handle, PASSTHROUGH, 0, @Buff, nil);
          printer.EndDoc;
        end;
      end;
    ...NO ONE IS INNOCENT ANYMORE...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464
    Non esiste un'equivalente della funzione che cerchi, ma il problema più grosso sta nel fatto che le funzioni API da richiamare richiedono una serie di parametri di cui devi fare il "marshalling" poichè stai lavorando con .NET.

    .NET è una piattaforma gestita che utilizza un Garbage Collector: passare dall'ambiente "gestito" all'ambiente nativo, quindi "non gestito", richiede a volte l'uso di classi e metodi per convertire i valori della propria applicazione in quelli attesi dalle funzioni API che si desidera richiamare.

    Per ciò che devi fare, l'operazione è anche molto complessa, e mi risulta ancora oscuro il motivo per cui si crea un'applicazione .NET per richiamare poi funzioni API di Windows: quali vantaggi dovrebbe portare?

    Per dare un'idea di quello che comporta la scrittura di codice che "interopera" con le API, riporto il tuo esempio (opportunamente modificato) con le dovute istruzioni aggiuntive:

    codice:
    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils, Printers, Windows,
      System.Text, System.Runtime.InteropServices;
    
    type
    
      [StructLayout(LayoutKind.Sequential)]
      TPrnBuffRec = record
        BuffLength: Word;
        Buffer: array [0..255] of Byte;
      end;
    
    procedure PrintLine;
    var
      Buff: TPrnBuffRec;
      TestInt : Integer;
      TestIntPtr: IntPtr;
      SourcePtr: IntPtr;
      e: ASCIIEncoding;
      s: string;
    begin
      s := #27 + 'W1'+ 'A test string ' + #27 + #10 + ' Ciao Ciao';
      TestInt := PASSTHROUGH;
      Buff.BuffLength := s.Length;
      e := ASCIIEncoding.Create;
      Buff.Buffer := e.GetBytes(s);
      SourcePtr := Marshal.AllocHGlobal(Marshal.SizeOf(Buff));
      try
        Marshal.StructureToPtr(Buff, SourcePtr, False);
        TestIntPtr := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TestInt)));
        try
          Marshal.WriteInt32(TestIntPtr, TestInt);
          if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), TestIntPtr, IntPtr.Zero) > 0 then
          begin
            Printer.BeginDoc;
            Escape(Printer.Canvas.Handle, PASSTHROUGH, SizeOf(TPrnBuffRec), SourcePtr, IntPtr.Zero);
            Printer.EndDoc;
          end;
        finally
          Marshal.FreeHGlobal(TestIntPtr);
        end;
      finally
        Marshal.FreeHGlobal(SourcePtr);
      end;
    end;
    
    begin
      PrintLine;
    end.
    Questo è ciò che io chiamo "un bagno di sangue".

    So cosa mi stai per dire, che devi seguire le specifiche che ti sono state date.

    Beh, direi che puoi buttarle via o rispedirle al mittente in quanto solo un pazzo proseguirebbe su questa strada.

    Una fatica del genere per stampare una semplice stringa su una stampante mi sembra davvero eccessiva, oltre al fatto che passi continuamente da .NET a Win32 e viceversa...sarei proprio curioso di leggerle queste "specifiche" per vedere di cosa si tratta...credo siano degne di un romanzo di Asimov!

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Mah, penso che neppure Asimov sarebbe arrivato a tanto...
    In effetti di fantascienza si tratta, appena finito il lavoro (speriamo a breve) ti spiego poi con un pm. Ciao e intanto grazie!
    ...NO ONE IS INNOCENT ANYMORE...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.