Ответы пользователя по тегу Программирование
  • Как добавить дополнительные свойства объектам одного класса и сделать обработчик один на всех?

    @KTG Автор вопроса
    В итоге вышло вот так:
    unit DynamicGrid;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.UITypes, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CompoMansEh, Vcl.ExtCtrls,
      PivotGridToolsEh, Data.DB, EhLibVCL, GridsEh, DBAxisGridsEh, DBVertGridsEh,
      Vcl.StdCtrls, Vcl.DBCtrls, Data.Win.ADODB, DBGridEhGrouping, ToolCtrlsEh,
      DBGridEhToolCtrls, DynVarsEh, DBGridEh, System.ImageList, Vcl.ImgList;
    
    
    type
      TDynamicGrid = class(TDBGridEh)
        private
          PanelOnGrid: TPanel ;
          HighlightColor: TColor;
          GlobalArrSList: TStringList;
          FieldForPanel: String;
          FieldForkey: String;
        public
          property FieldPanel : String read FieldForPanel write FieldForPanel;
          property FieldKey : String read FieldForKey write FieldForKey;
          property GridPanel : TPanel read PanelOnGrid write PanelOnGrid;
          property HColor: TColor read HighlightColor write HighlightColor;
          property GlobalArr: TStringList read GlobalArrSList write GlobalArrSList;
    
          procedure ShowPanel(Sender: TCustomDBGridEh;
                    CursorPos: TPoint; Cell: TGridCoord; InCellCursorPos: TPoint;
                                    Column: TColumnEh; var Params: TDBGridEhDataHintParams;
                                                    var Processed: Boolean);
    
          constructor Create(AOwner : TComponent); override;
          destructor Destroy; override;
     end;
    
    implementation
    
    procedure TDynamicGrid.ShowPanel;
    var
     ScrPt, GrdPt: TPoint;
     grCell: TGridCoord;
     rect: TRect;
     rectX, rectY : extended;
     Name, ID: string;
    begin
      ScrPt := Mouse.CursorPos;
      GrdPt := self.ScreenToClient(ScrPt);
    
      grCell := self.MouseCoord(GrdPt.X, GrdPt.Y);
    
      rect := self.CellRect(grCell.X, grCell.Y);
    
        rectX := Rect.TopLeft.X + Rect.Width;
        rectY := Rect.TopLeft.Y + Rect.Height/2 + Rect.Height - 1;
    
      if grCell.Y = self.Row then
        self.PanelOnGrid.Color := self.HColor
      else
        self.PanelOnGrid.Color := clWhite;
    
        self.PanelOnGrid.Left := trunc(rectX - self.PanelOnGrid.Width/2);
        self.PanelOnGrid.Top := trunc(rectY);
    
        self.PanelOnGrid.Visible := true;
    
        Name := self.DataSource.DataSet.FieldByName(self.FieldPanel).AsString;
          ID := self.DataSource.DataSet.FieldByName(self.FieldKey).AsString;
    
        self.GlobalArr.Values[self.FieldKey] := ID;
        self.GlobalArr.Values[self.FieldPanel] := Name;
    
       TForm(self.Parent).caption := 'Справочник: ' + Name;
    end;
    
    constructor TDynamicGrid.Create(AOwner: TComponent);
    begin
      inherited;
      self.OnDataHintShow := showpanel;
    end;
    
    destructor TDynamicGrid.Destroy;
    begin
      inherited;
    end;
    
    end.
    Ответ написан
    Комментировать
  • Как сделать предопределенный обработчик события в Delphi?

    @KTG Автор вопроса
    В классе описал процедуру с теми же параметрами которые она принимает.
    procedure ShowPanel(Sender: TCustomDBGridEh;
                    CursorPos: TPoint; Cell: TGridCoord; InCellCursorPos: TPoint;
                                    Column: TColumnEh; var Params: TDBGridEhDataHintParams;
                                                    var Processed: Boolean);


    Процедуру саму описывал без параметров
    procedure TDynamicGrid.ShowPanel;
    var
    begin
    end;

    присваивал так:
    constructor TDynamicGrid.Create(AOwner: TComponent);
    begin
      inherited;
      self.OnDataHintShow := showpanel;
    end;


    Изначально ошибка была в том, что при создании DBGrid - он еще не имеет колонок (индексов колонок, имен колонок). Вот и обращался не пойми куда.

    Но тут скорей придется в ShowPanel, отдельно проверять что это событие нужной колонки.
    Ответ написан
    Комментировать
  • Delphi. Как из события с message CM_MOUSEENTER вызывать событие с CM_MOUSEENTER?

    @KTG Автор вопроса
    Получаю handler текущего компонента, без извращений с CM_MOUSEENTER. Просто в момент ухода с Grid'а смотрю что под курсором:
    var
      MouseCoord : TPoint;
    begin
    GetCursorPos(MouseCoord);
    integer(FindDragTarget(MouseCoord, false)
    Ответ написан
    Комментировать
  • Delphi. Hint. Как задать скорость появления подсказки?

    @KTG Автор вопроса
    При первом наведении мыши на DBgrid ставлю Application.HintPause := 0;
    И меняю его к стандартному при уходе с компонента, по событию MouseLeave (CM_MOUSELEAVE).
    Аpplication.HintPause := 500;
    Ответ написан
    Комментировать
  • Delphi. DBGridEh. Как получить данные ячейки при наведении на неё курсора мыши?

    @KTG Автор вопроса
    type
      TCrackDBGrid = class(TDBGridEh)
      end;
    ...
    var
      MoveFlag: integer;
    ...
    procedure TFSprav.DBGridEh2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
     grCoord: TGridCoord;
     aGrid: TCrackDBGrid;
     NewActiveRecord, oldActiveRecord: integer;
     delta: string;
    begin
      if MoveFlag <> 1 then
        begin
          MoveFlag := 1;
          aGrid := TCrackDBGrid(Sender);
            grCoord := aGrid.MouseCoord(X, Y);
            aGrid.DataSource.DataSet.DisableControls;
    
              oldActiveRecord := aGrid.DataLink.ActiveRecord; 
              newActiveRecord := grCoord.Y - aGrid.DataLink.ActiveRecord; 
    
          aGrid.DataLink.MoveBy(newActiveRecord);
          delta := aGrid.DataLink.DataSet.FieldByName('Name').AsString;
    
          if grCoord.X > 0 then
            begin
             caption := delta;
            end;
    
         aGrid.DataLink.ActiveRecord := oldActiveRecord;
         aGrid.DataSource.DataSet.EnableControls;
    
          MoveFlag := 0;
        end;
    end;
    
    
    procedure TFSprav.dsMainCatDataChange(Sender: TObject; Field: TField);
    begin
      if MoveFlag = 0 then
      begin
      qCat.Active := false;
        qCat.Parameters.ParamByName('id_MainCat').Value := dsMainCat.DataSet.FieldByName('id').AsInteger;
      qCat.Active := true;
      end;
    
    end;
    Ответ написан
  • Как сканировать на МФУ из лотка через WIA (VBA)?

    @KTG Автор вопроса
    разобрался.
    "objDev.Properties("Document Handling Select").Value = 1"
    Полностью код в комментариях к вопросу
    WIA ошибка при установке параметра PAGES (VBA). Почему?
    Ответ написан
    Комментировать
  • WIA ошибка при установке параметра PAGES (VBA). Почему?

    @KTG Автор вопроса
    Вот кстати полностью рабочий код, который делает то, что от него требуется.
    Сканирует без диалога все листы из автоподатчика, пока не вывалиться ошибка Err.Number -2145320957.
    Затем все конвертирует в TIFF и сохраняет в один многостраничный документ.

    Sub scan()
        
        Dim objDM As WIA.DeviceManager
        'MsgBox (Split(ActiveCell.Address, "$")(1))
            Dim objDev As WIA.Device
            
                Dim objItem As WIA.Item
                Dim objImage, FirstImage As WIA.ImageFile
                Dim objIP As WIA.ImageProcess
            
            Dim s As String
            Dim i, num As Integer
          
         Set objDM = New WIA.DeviceManager
         For i = 1 To objDM.DeviceInfos.Count
            If objDM.DeviceInfos(i).Type = 1 Then
              s = objDM.DeviceInfos(i).DeviceID
            End If
         Next
         
         Set objDev = objDM.DeviceInfos(s).Connect
         If objDev Is Nothing Then
            MsgBox ("Error: Not device found")
         Else
    
            objDev.Properties("Document Handling Select").Value = 1
            objDev.Properties("Pages").Value = 1
         
            Set objItem = objDev.Items(1)
         
                Set objImage = New WIA.ImageFile
                Set objIP = New WIA.ImageProcess
                
    ScanStart:
    
            On Error GoTo ScanError
                
                Set objImage = objItem.Transfer("{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}")
                num = num + 1
                If num = 1 Then
                    Set FirstImage = objImage
                Else
                    objIP.Filters.Add (objIP.FilterInfos("Frame").FilterID)
                    objIP.Filters(objIP.Filters.Count).Properties("ImageFile") = objImage
                    objIP.Filters(objIP.Filters.Count).Properties("FrameIndex") = objIP.Filters.Count
                End If
    
            GoTo ScanStart
            
    ScanError:
    
            Select Case Err.Number
                Case -2145320957
                    MsgBox ("No More Pages Found")
    
                    objIP.Filters.Add (objIP.FilterInfos("Convert").FilterID)
                    objIP.Filters(objIP.Filters.Count).Properties("FormatID") = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
                    Set FirstImage = objIP.Apply(FirstImage)
                    FirstImage.SaveFile "c:\test\" & ActiveCell.Value & num & ".TIFF"
                Case Else
                    MsgBox ("Error: " & Err.Description & "(" & Err.Number & ")")
            End Select
            
            Set FirstImage = Nothing
            Set objItem = Nothing
            Set objImage = Nothing
            Set objDev = Nothing
         End If
         
         Set objDev = Nothing
         Set objDM = Nothing
        
    End Sub
    Ответ написан
    4 комментария
  • Возможно ли написать скрипт сканирования для Excel 2010?

    @KTG Автор вопроса
    Разобрался.
    Повесил кнопку, написал обработчик вызывающий сканирование.
    Следующим шагом нужно сделать многостраничное сканирование, т.е. если нужно несколько сканов сохранить в один документ.
    PDF или многостраничный TIF.
    PDF видимо не подойдет, т.к. придется таскать за собой внешнюю библиотеку для создания PDF?
    А в случае с файлами xlsm формата (Excel c макросами) это не совсем удобно.
    Ответ написан
    Комментировать