منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "المبتدئين";
الأرشيف الحالي: 2018.10.21;
تنزيل: [xml.tar.bz2];

إلى

TPanel على الطفل من TCustomControl البحث عن فروع مماثلة


Денис11998833   (2016-09-06 02:56) [0]

صادفت مكونًا مفيدًا يستند إلى TCustomControl ، والذي يظهر نافذة في منطقة الدرج.

كان كل شيء على ما يرام حتى أضع TPanel على هذا التحكم. لسبب ما ، لا يتم عرض اللوحة ولا المكونات على اللوحة. مثال بسيط أرمي الملصق مباشرةً إلى KMAlert ، حيث يتم رسمه ورمي لوحته واللوحة بدورها أرميها إلى KMAlert ولا يتم رسم أي شيء.

قتل يوم على موضوع ، صحيح في مكان ما قريب ، ولكن أبدا معرفة ما يحتاج إليه.

هنا هو المصدر الأصلي (التأليف ليس لي ، بفضل المؤلف):


unit KMAlert;

interface

uses
 Windows, Classes, Messages, Controls, Forms, ExtCtrls, Graphics,
 SysUtils, ShellApi;

type
 TAlertDirection = (adNone, adUp, adDown, adLeft, adRight);
 TOnShow = procedure (Sender: TObject) of object;
 TOnClose = procedure (Sender: TObject) of object;

type
TKMAlert = class(TCustomControl)
 private
  FAlertDirection: TAlertDirection;
   FCloseDelay: Integer;
   FDelayTimer: TTimer;
   FForegroundColor: TColor;
   FInProgress: Boolean;
   FOnShow: TOnShow;
   FOnClose: TOnClose;
   TaskBarRect: TRect;
   FPanel1: TPanel;
   function FindTaskbar(var ARect: TRect): Integer;
   procedure GetTaskBar;
   procedure SetCloseDelay(const Value: Integer);
   procedure SetForegroundColor(const Value: TColor);
   procedure GoPopUp;
 protected
   procedure CreateParams(var Params: TCreateParams); override;
   procedure CreateWnd; override;
   procedure DoDelayTimer(Sender: TObject);
   procedure Paint; override;
   procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
   procedure WMSize(var Message: TWMSize); message WM_SIZE;
   procedure Loaded; override;
   procedure SetParent(AParent: TWinControl); override;
 public
  constructor Create(AOwner: TComponent); override;
  procedure PopUp;
  procedure CloseUp;
   procedure Show(X, Y: Integer);
 published
   property CloseDelay: Integer read FCloseDelay write SetCloseDelay;
   property Font;
   property ForegroundColor: TColor read FForegroundColor write SetForegroundColor;
   property OnShow: TOnShow read FOnShow write FOnShow;
   property OnClose: TOnClose read FOnClose write FOnClose;
   property OnClick;
   property OnContextPopup;
   property OnDblClick;
   property OnDragDrop;
   property OnDragOver;
   property OnEndDock;
   property OnEndDrag;
   property OnMouseDown;
   property OnMouseMove;
   property OnMouseUp;
   property OnStartDock;
   property OnStartDrag;
 end;

procedure Register;

var
 TaskBarPos: Cardinal;

implementation

{ TKMAlert }

procedure Register;
begin
 RegisterComponents("KMAlert", [TKMAlert]);
end;

constructor TKMAlert.Create(AOwner: TComponent);
begin
 inherited;
 Visible:= csDesigning in ComponentState;
 ControlStyle:= ControlStyle + [csAcceptsControls, csReplicatable];
 FAlertDirection:= adNone;
 FCloseDelay:= 5000;
 FForegroundColor:= clInfoBk;
 FInProgress:= False;
 FDelayTimer:= TTimer.Create(Self);
 FDelayTimer.Enabled:= False;
 FDelayTimer.OnTimer:= DoDelayTimer;
 FDelayTimer.Interval:= FCloseDelay;
 FPanel1:=TPanel.Create(Self);
 FOnShow:= nil;
 ParentColor:= True;
 Height:= 153;
 Width:= 169;
end;

procedure TKMAlert.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 with Params do
  if not (csDesigning in ComponentState) then
   begin
    WndParent:= GetDesktopWindow;
     Style:= WS_CLIPSIBLINGS or WS_CHILD;
    ExStyle:= WS_EX_TOPMOST or WS_EX_TOOLWINDOW;
     WindowClass.Style:= CS_DBLCLKS or CS_SAVEBITS and not(CS_HREDRAW or CS_VREDRAW);
  end;
end;

procedure TKMAlert.CreateWnd;
begin
 inherited;
end;

procedure TKMAlert.SetCloseDelay(const Value: Integer);
begin
 FCloseDelay:= Value;
 FDelayTimer.Interval:= Value;
end;

procedure TKMAlert.SetForegroundColor(const Value: TColor);
begin
 FForegroundColor:= Value;
 Invalidate;
end;

procedure TKMAlert.DoDelayTimer(Sender: TObject);
begin
 FInProgress:= False;

 FDelayTimer.Enabled:= False;

 CloseUp;
end;

procedure TKMAlert.GoPopUp;
var
delta: Integer;
begin
 if Assigned(FOnShow) then FOnShow(Self);

 delta:= 0;

 case TaskBarPos of
   ABE_BOTTOM:
     delta:= TaskbarRect.Bottom - TaskbarRect.Top;
   ABE_TOP:
     delta:= TaskbarRect.Bottom;
   ABE_LEFT:
     delta:= TaskbarRect.Right;
   ABE_RIGHT:
     delta:= TaskbarRect.Right - TaskbarRect.Left;
 end;

 case FAlertDirection of
   adUp:
   begin
     SetWindowPos(Handle, HWND_TOPMOST, (Screen.Width - Width),
         (Screen.Height - delta) - Height, Width, Height, SWP_HIDEWINDOW);
     AnimateWindow(Handle, 500, AW_VER_NEGATIVE + AW_SLIDE);
     FDelayTimer.Enabled:= True;
   end;
   adDown:
   begin
     SetWindowPos(Handle, HWND_TOPMOST, Screen.Width - Width,
                  delta, Width, Height, SWP_HIDEWINDOW);
     AnimateWindow(Handle, 500, AW_VER_POSITIVE + AW_SLIDE);
     FDelayTimer.Enabled:= True;
   end;
   adLeft:
   begin
     SetWindowPos(Handle, HWND_TOPMOST, (Screen.Width - delta) - Width,
         Screen.Height - Height, Width, Height, SWP_HIDEWINDOW);
     AnimateWindow(Handle, 500, AW_HOR_NEGATIVE + AW_SLIDE);
     FDelayTimer.Enabled:= True;
   end;
   adRight:
   begin
     SetWindowPos(Handle, HWND_TOPMOST, delta,
                  Screen.Height - Height, Width, Height, SWP_HIDEWINDOW);
     AnimateWindow(Handle, 500, AW_HOR_POSITIVE + AW_SLIDE);
     FDelayTimer.Enabled:= True;
   end;
 end;
end;



Денис11998833   (2016-09-06 02:57) [1]



procedure TKMAlert.CloseUp;
var
 OldPos: Cardinal;
begin
 if Assigned(FOnClose) then FOnClose(Self);

 OldPos:= TaskBarPos;

 GetTaskBar;

 FDelayTimer.Enabled:= False;

 if OldPos <> TaskBarPos then
   FAlertDirection:= adNone;

 case FAlertDirection of
   adUp:
     AnimateWindow(Handle, 500, AW_VER_POSITIVE + AW_SLIDE + AW_HIDE);
   adDown:
     AnimateWindow(Handle, 500, AW_VER_NEGATIVE + AW_SLIDE + AW_HIDE);
   adLeft:
     AnimateWindow(Handle, 500, AW_HOR_POSITIVE + AW_SLIDE + AW_HIDE);
   adRight:
     AnimateWindow(Handle, 500, AW_HOR_NEGATIVE + AW_SLIDE + AW_HIDE);
   adNone:
     AnimateWindow(Handle, 500, AW_CENTER + AW_SLIDE + AW_HIDE);
 end;
end;

procedure TKMAlert.Show(X, Y: Integer);
begin
 if Assigned(FOnShow) then FOnShow(Self);

 FInProgress:= True;

 SetWindowPos(Handle, HWND_TOPMOST, X, Y,
              Width, Height, SWP_HIDEWINDOW);

 AnimateWindow(Handle, 500, AW_CENTER + AW_SLIDE);

 FAlertDirection:= adNone;

 FDelayTimer.Enabled:= True;
end;

procedure TKMAlert.WMNCPaint(var Message: TMessage);
begin
 inherited;
end;

procedure TKMAlert.WMSize(var Message: TWMSize);
begin
 inherited;
end;

procedure TKMAlert.Paint;
var
 R: TRect;
begin
 inherited;
{ with Canvas do
 begin
   Brush.Color:= ForegroundColor;
   FillRect(ClientRect);

   R:= ClientRect;
   OffsetRect(R, R.Left, R.Top);
   DrawEdge(Handle, R, EDGE_RAISED, BF_RECT);
   InflateRect(R, -2, -2);
   DrawEdge(Handle, R, EDGE_SUNKEN, BF_RECT);
 end;  }
end;

procedure TKMAlert.Popup;
begin
 ShowWindow(Handle, SW_HIDE);

 GetTaskBar;

 case TaskBarPos of
   ABE_BOTTOM:
    FAlertDirection:= adUp;
   ABE_TOP:
     FAlertDirection:= adDown;
   ABE_LEFT:
     FAlertDirection:= adRight;
   ABE_RIGHT:
     FAlertDirection:= adLeft;
 end;

 FInProgress:= True;

 GoPopUp;
end;

function TKMAlert.FindTaskbar(var ARect: TRect): Integer;
var
AppData: TAppBarData;
begin
AppData.Hwnd:= FindWindow("Shell_TrayWnd", nil);
 AppData.cbSize:= SizeOf(TAppBarData);
 if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) = 0 then
   raise Exception.Create("SHAppBarMessage returned false when trying " +
     "to find the Task Bar""s position");
 Result:= AppData.uEdge;
 ARect:= AppData.rc;
end;

procedure TKMAlert.GetTaskBar;
begin
 TaskBarPos:= FindTaskBar(TaskBarRect);
end;

end.



Денис11998833   (2016-09-06 02:58) [2]

يرتبط السؤال النظري. كتب المؤلف لسبب ما:

الداخلي TKMAlert.WMNCPaint (var Message: TMessage) ؛ بدأ الموروثة. ينتهي.

أليس هذا بمثابة رمز مفقود في هذه الحالة؟



Игорь Шевченко ©   (2016-09-06 10:54) [3]


> كتب المؤلف لسبب ما:


تصور لإنجاز ، فشل.


> أليس هذا بمثابة جزء من الكود المفقود في هذا
> القضية؟


هذا بمثابة نقص الكود على أي حال ، وليس هذا فقط.


> لسبب ما ، لا يتم عرض اللوحة ولا المكونات على اللوحة


لا تستخدم اللوحة



Денис11998833   (2016-09-06 12:53) [4]

المشكلة هي أن هناك مكونًا مخصصًا يستند إلى TCustomPanel ، والذي بدونه سيكون من الصعب القيام به (

ولكن هل هناك سبب وجذر واتجاه لحلها؟



Игорь Шевченко ©   (2016-09-06 17:03) [5]


> ولكن لا يزال هناك سبب وجذر واتجاه لحلها؟


هناك دائما. على سبيل المثال ، استخدم مصحح أخطاء أو تتبع الرسائل.

بالمناسبة ، لماذا؟

FPanel1: = TPanel.Create (Self)؛



Денис11998833   (2016-09-06 19:03) [6]

> هناك دائما. على سبيل المثال ، استخدم مصحح أخطاء أو تتبع الرسائل.

حسنا ، أنت لم تقل على الفور ، والآن أصبح كل شيء واضحا! لقد دفعت بالفعل المصحح طوال الوقت وعبر. ولم أحضر إلى هنا بعد عينات 5 دقيقة من القلم ، لأني أعاني من هذه المشكلة طوال أيام 2.

لكن في الأساس ، هل يمكنك قول شيء ما؟

> بالمناسبة ، لكن لماذا؟

نسيت أن أزال ، جربت مع المقبس.



Денис11998833   (2016-09-06 20:18) [7]

مرئي: = صحيح

حل جزئي للمشكلة.

تبقى المشكلة أن AnimateWindow لا يرسل WM_PAINT أثناء الحركة. فقط WM_PRINT و WM_RPINTCLIENT في بداية ونهاية الرسم. أي يتم رسم عناصر التحكم فقط في نهاية الرسوم المتحركة.

والسؤال هو كيفية فرض المكونات الفرعية على عنصر التحكم الذي لا يزال مخفيًا (مرئي = خطأ). بقدر ما أعرف ، يعارض Windows هذا (..



Eraser ©   (2016-09-06 21:14) [8]


> Denis11998833

مرة واحدة كان من الضروري حل مشكلة مماثلة ، في رأيي لم يكن هناك حل طبيعي على الفور وسجلوا.

منذ وقت ليس ببعيد رأيت مثل هذا المكون TdxCalloutPopup (من مجموعة devexpress) ، فإنه يفعل ما يحتاج إليه. كيف - لم أفهم.



صفحات: 1 فرع كامل

المنتدى: "المبتدئين";
الأرشيف الحالي: 2018.10.21;
تنزيل: [xml.tar.bz2];

الطابق العلوي





الذاكرة: 0.6 ميغابايت
الوقت: 0.014 ج
1-1359522126
Vasya
2013-01-30 09:02
2018.10.21
Treeview الظاهري كيفية إخفاء سلسلة


2-1473244823
فاليا
2016-09-07 13:40
2018.10.21
قراءة خط الكتابة من الملف


11-1267468114
بوغسلاف
2010-03-01 21:28
2018.10.21
فارق التوقيت


2-1473119810
Denis11998833
2016-09-06 02:56
2018.10.21
TPanel على الطفل من TCustomControl


2-1472826405
هو انا
2016-09-02 17:26
2018.10.21
الخاصية لا تقرأ قيمة الحقل





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch English الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский