Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

KOL SpinEdit   Найти похожие ветки 

 
Сашик   (2008-03-06 10:50) [0]

Если кому интересно, привожу простенький SpinEdit (по мотивам KOL UpDown). Максимальные значения практически не ограничены. Возможна масса доработок. Жду замечаний...

unit NSpinEdit;

interface
uses Windows, KOL, Messages;

type
 NM_UPDOWN = packed record
   hdr: TNMHDR;
   iPos: Integer;
   iDelta: Integer;
 end;

 TNMUpDown = NM_UPDOWN;
 PNMUpDown = ^TNMUpDown;

  PSpinEdit = ^TNSpinEdit;
//   TKOLUpDown = PSpinEdit;

TNSpinEdit = object(TObj)
 private
    FValue: Variant;
 protected
    procedure SetValue(const aValue: Variant);
 public
     UpHandle: THandle;
     Maximum,
     Minimum,
     Increment: Variant;
     UpDown,
     Edit: PControl;
     destructor Destroy; virtual;
    property Value: Variant read FValue write SetValue;
end;

function NewUpDown(AOwner: PControl; aValue, aMin, aMax, aInc: Variant): PSpinEdit;
function NewUpDownDef(AOwner: PControl; aValue: Variant): PSpinEdit;

function UpDownWndProc(Sender: PControl; var Msg:TMsg; var Rslt:Integer):Boolean;
function SpinEditWndProc(Sender: PControl; var Msg:TMsg;var Rslt:Integer):Boolean;

implementation

const
 UPDOWN_CLASS = "msctls_updown32";
 UDS_ALIGNRIGHT = $0004;
 UDN_FIRST    = 0-721;
 UDN_DELTAPOS = UDN_FIRST - 1;

function NewUpDownDef(AOwner: PControl; aValue: Variant): PSpinEdit;
  begin
    Result:= NewUpDown(AOwner, aValue, 0, 1000000, 100);
end;

function NewUpDown(AOwner: PControl; aValue, aMin, aMax, aInc: Variant): PSpinEdit;
  var Flags: Integer;
  begin
      New(Result, Create);
      AOwner.Add2AutoFree(Result);
      Result.Edit:= NewEditBox(AOwner,[]);
      Result.Edit.Color:= clWindow;
      Flags:= UDS_ALIGNRIGHT;
      Result.UpDown:= _NewCommonControl(Result.Edit, UPDOWN_CLASS,
    WS_VISIBLE or  WS_CHILD or Flags, False,nil);
      Result.UpDown.ExStyle := WS_EX_CLIENTEDGE;
      Result.UpDown.TabStop:= False;
      Result.UpDown.HasBorder:= False;
      Result.UpHandle:= Result.UpDown.GetWindowHandle;
      Result.UpDown.Tag:= LongInt(Result);
      Result.Minimum:= aMin;
      Result.Value:= aValue;
      Result.Maximum:= aMax;
      Result.Increment:= aInc;
      Result.UpDown.AttachProc(UpDownWndProc);
      Result.Edit.AttachProc(SpinEditWndProc);
end;

function UpDownWndProc(Sender: PControl; var Msg:TMsg; var Rslt:Integer):Boolean;
   var NMUpDown: PNMUpDown; UpDownNow: PSpinEdit; Tmp: Variant;
   begin
      Result:= False;
      if Msg.message = WM_NOTIFY then begin
         NMUpDown:= PNMUpDown(Msg.lParam);
         if NMUpDown.hdr.code = UDN_DELTAPOS then begin
            UpDownNow:= PSpinEdit(Sender.Tag);
            if not Assigned(UpDownNow) then Exit;
            with UpDownNow^ do begin
               if (NMUpDown.iDelta = -1) then Tmp:= FValue - Increment
               else if (NMUpDown.iDelta = 1) then Tmp:= FValue + Increment;
               if Tmp >= Maximum then Tmp:= Maximum;
               if Tmp <= Minimum then Tmp:= Minimum;
               Value:= Tmp;
       end;
     end;
   end;
end;

function SpinEditWndProc(Sender: PControl; var Msg:TMsg;var Rslt:Integer):Boolean;
  var UPD: PControl; H, W: Integer;
  begin
     Result:= False;
     with Sender^ do
         if Msg.message = WM_PAINT then begin
            UPD:= Children[0];
            H:= ClientHeight;
            W:= H;
            UPD.SetSize(W, H).SetPosition(Width - W - 4, 1);
        end else if (Msg.message = WM_KEYUP) and (Length(Text) > 0) then
         PSpinEdit(Children[0].Tag).Value:= Variant(Text);
end;

destructor TNSpinEdit.Destroy;
  begin
     FValue:= Unassigned;
     Free_And_Nil(UpDown);//.Free;
     Free_And_Nil(Edit);
    inherited Destroy;
end;

procedure TNSpinEdit.SetValue(const aValue: Variant);
  begin
     FValue:= aValue;
     Edit.Text:= VarTostr(FValue);
end;

initialization
  DoInitCommonControls(ICC_UPDOWN_CLASS);
finalization


 
Сашик   (2008-03-06 11:16) [1]

Инструкция по применению: NewUpDownDef(Form, 100).Edit.SetSize(80, 20).SetPosition(10,10);


 
mdw ©   (2008-03-06 13:19) [2]

Гм, ничего личного, но порадовали, порадовали!
1. работать будет не везде (например в WinCE это точно не будет работать), в отличие от MHUpDown. Хотя там аналогично обрабатываются нажатия, а уж счетчик можно и самому организовать, как нравится.
2. Edit.Text:= VarTostr(FValue); - Это вообще супер! Ну и вообще все конструкции с типом Variant.... А что, почему бы не цепануть Variants, SysUtils и иже с ними? Только нафига тогда KOL?


 
Dimaxx ©   (2008-03-06 13:33) [3]

А накой леший вообще тут Variant??


 
Сашик   (2008-03-06 14:25) [4]

Variant дан для примера. При соответствующей обработки участка кода "супер VarToStr" можно создать SpinEdit для Float...


 
mdw ©   (2008-03-06 20:22) [5]

Просто, уже есть рабочий компонент, с зеркалом при том.
А на счет "При соответствующей обработки участка кода "супер VarToStr" можно создать SpinEdit для Float..." - смысла нет, достаточно просто иметь возможность обрабатывать нажания кнопок (это тоже уже есть), а дальше самому реагировать как надо. Например анализировать где стоит каретка в едите (перед запятой или после), и соответственно менять челую или дробную часть, или вообше символы менять от "A" до "Z", например.
А "сучности" плодить не сто`ит. Зачем отдельный контрол для Integer, отдельный для Float,  отдельный для Char и т.д?


 
Сашик   (2008-03-06 22:05) [6]

mdw - большое спасибо за продолжение дискуссии.
Однако хочу пояснить простоту использования предложенного SpinEdit:
1) при вызове NewUpDown(Form, 1.4, 0, 4.2, 0.7).Edit.SetSize(80, 20).SetPosition(10,10) - это FloatSpinEdit
2) при вызове NewUpDown(Form, 1, 0, 5, 1).Edit.SetSize(80, 20).SetPosition(10,10) - это IntegerSpinEdit
Помимо этого при переборе дочерних Controls, мой SpinEdit проходит как 1 Children, а MHUpDown с довеском, как 2, что очень неудобно при массиве Controls (наблюдении их поведения и изменения размеров). Вообще не понимаю причину использования версий Delphi 6 и 7 для программирования в KOL? В Delphi 4 не требуется добавления uses Variant, и размер программ меньше...


 
mdw ©   (2008-03-06 23:03) [7]

Да я не против, присылайте юнит, выложу на сайте. Хуже никому не будет, а может пригодится.
Насчет версий Delphi, тут дело каждого. Мне приходится работать на семерке, а дома принципиально даже не устанавливаю Делфи, да и времени нет. Да и вообще, что-то не очень были впечатления от чеверки..., ну да неважно, повторюсь, дело личного каждого.
Короче, если считаете что есть код, полезный не только Вам, то присылайте.


 
Сашик   (2008-03-06 23:47) [8]

mdw, я на на форумах в первый раз. Не знаю куда и как посылать, если не затруднит - подскажите...


 
Elec3C ©   (2008-03-07 01:14) [9]


> Не знаю куда

На мыло mdw.



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1243778505
Тимохов_
2009-05-31 18:01
2009.08.02
Значение акронима


2-1244381829
anvolkov
2009-06-07 17:37
2009.08.02
Многократно копировать форму в MDI приложении


2-1244444905
LDV
2009-06-08 11:08
2009.08.02
CF_DIB и CF_BITMAP


15-1243590415
pasha_golub
2009-05-29 13:46
2009.08.02
Delphi 2009 breakpoints


15-1243606985
Пит
2009-05-29 18:23
2009.08.02
Сертификация ПО





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский