Impossible de définir correctement la partie à scanner avec DelphiTwain

ALSC Messages postés 19 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 juin 2021 - 3 mars 2008 à 12:58
ALSC Messages postés 19 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 juin 2021 - 5 mars 2008 à 13:39
Bonjour,

J'utilise DelphiTwain avec Delphi 7.

Mon problème est le suivant :

Je n'arrive pas à définir la partie à scanner avec précision en utilisant la fonction "Twain.Source[...].EnableSource" (pour scanner).
Quel que soit le type d'unité que je choisisse avec "Twain.Source[...].SetICapUnits" (tuInches, tuCentimeters, tuPicas, tuPoints, tuTwips, tuPixels, tuUnknown), il reste sur tuInches.
De plus, en utilisant "Twain.Source[...].SetImageLayoutFrame(0, 0, 1.5, 1.5)", il ne prend pas les chiffres après la virgule.Autrement dit, pour SetImageLayoutFrame, 1 ou 1,1 ou 1,5 ou 1,9 1 inch; 2 ou 2,1 ou 2,5 ou 2,9 2 inches et ainsi de suite.

Quelqu'un à t'il déjà rencontré ce problème ? et surtout à t'il une solution ?

Merci

ALSC

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
3 mars 2008 à 18:56
http://delphitwain.sourceforge.net/

regarde les exemples si tu ne l'as pas deja fait.

pense aussi a lire les exemples dans le CHM de l'archive.

n'utilisant jamais DelphiTWain ni même TWain en regle general ... je ne peu t'en dire plus.


0
ALSC Messages postés 19 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 juin 2021
3 mars 2008 à 19:56
Merci pour ta réponse, mais j'ai bien sur déjà regardé les exemples.


J'ai aussi retourné le CHM dans tous les sens, mais je n'ai rien trouvé.


Ce qui est dommage, c'est qu'il n'y ai pas d'exemple sur la manière de numériser sans utiliser l'interface Twain (ShowUI=false).


Peut-être que je me trompe dans l'ordre d'appel des méthodes, mais je ne pense pas.


A tout hasard, je laisse un exemple de ma source qui ne fonctionne pas:


if not DM.Twain.LoadLibrary then Exit;
if not DM.Twain.LoadSourceManager then Exit;
if not DM.Twain.Source[DM.TPRScanSourceIndex.AsInteger].LoadSource then Exit;
with DM.Twain.Source[DM.TPRScanSourceIndex.AsInteger] do
  begin
    TransferMode:=TTwainTransferMode(ttmMemory);
    SetIPixelType(tbdGray);
    SetIBitDepth(8);
    SetIXResolution(300);
    SetIYResolution(300);
    SetIndicators(false); //Censé masquer une fenêtre de progression qui s'affiche quand même
    SetICapUnits(tuCentimeters)); //Ca reste en Inches
    SetImagelayoutFrame(vLeft, vTop, vRight, vBottom);  //Ne prend que la partie entière des valeurs
    EnableSource(false, false); // paramètres: ShowUI, Modal - Modal à true ou false ne change rien, ça reste modal 
    while Enabled do Application.ProcessMessages;
  end;


Je tiens à préciser que celà ne provient pas du scanner qui fonctionne tres bien avec ShowUI.


Si personne n'a de solution, peut-être que quelqu'un pourrais m'indiquer un autre composant qui fonctionne ?




Encore merci

ALSC
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
4 mars 2008 à 19:30
function GetICapUnits(var Return: TTwainUnit;
      var Supported: TTwainUnitSet; Mode: TRetrieveCap
      {$IFDEF DEFAULTPARAM}=rcGet{$ENDIF}): TCapabilityRet;

function SetICapUnits(Value: TTwainUnit): TCapabilityRet;

appel GetICapUnits pour verifier deja si le peripherique supporte le truc.
verifie aussi le retour de fonction pour savoir si une erreur n'est pas survenue.

TCapabilityRet = (crSuccess, crUnsupported, crBadOperation, crDependencyError,
    crLowMemory, crInvalidState, crInvalidContainer);

essaye ça a la place de la ligne SetICapUnits();

case SetICapUnits(tuCentimeters) of
  crUnsuported : MessageDlg('Le peripherique ne supporte pas le systeme metrique!', mrWarning, [mbOk],0);
  crBadOperation : MessageDlg('Mauvaise manip mec!', mrWarning, [mbOk],0);
  crDependencyError : MessageDlg('Erreur de dependance, besoin de drogue ?', mrWarning, [mbOk],0);
  crLowMemory : MessageDlg('Rachete de la ram ... t'en a plus', mrWarning, [mbOk],0);
  crInvalidState : MessageDlg('Etat invalide, ça merde quelque part, sur, mais ou ?', mrWarning, [mbOk],0);
  crInvalidContainer : MessageDlg('Conteneur invalide ... forcement, ça marchera pas.', mrWarning, [mbOk],0);
end;


0
ALSC Messages postés 19 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 juin 2021
5 mars 2008 à 13:39
Merci beaucoup...

J'ai bien compris la leçon : pour résoudre un problème, ça ne sert à rien de tirer la gueule chacun de son côté, il faut dialoguer.

Fort de ce principe, j'ai demandé à mon scanner (comme tu me l'as conseillé) ce qu'il est capable de comprendre comme type d'unités... Et à mon grand étonnement, il m'a répondu "tuInches" et "tuPixels".

Je me suis dit qu'on était bien parti pour s'entendre...Mais rien à faire, le bougre continue à me chercher.

Quand je lui demande poliment de me numériser une zone en inches de p. ex. (0, 0, 1.8, 1.8), il continue à me numériser une zone de (0, 0, 1, 1) inches. En fait, il ne prend que la partie entière des coordonnées de la zone.

Voici le code :
SetICapUnits(tuInches));
SetImagelayoutFrame(0, 0, 1.8, 1.8);  //Ne prend que la partie entière des valeurs
EnableSource(false, false);

Comme tu as l'air de savoir leur parler, ne serait ce pas abuser de te demander pourquoi il me fait ça ?

Encore merci de bien vouloir jouer le rôle de médiateur entre moi et ce  de scanner.

ALSC
0