مشكلة في إظهار ScrollBar مع إستعمال TStyle ؟
#1
السلام عليكم ورحمة الله وبركاتة

مبروك اخوني مشرفين هذا المنتدى الكريم , في الحقيقة حزنت عندما وجدت ان المنتدى متوقف


لدي مشكلة عند استعمال احد الستايلات المتاحه في [ Appearance ]
على Form يوجد به خاصية الـ AutoScroll = True ... فإن الـ Scroll لا يظهر !!
صوره توضيحيه Smile
كود :
http://im32.gulfup.com/hRD0W.jpg

اضن ان المشكلة انه عند إستعمال TStyle يتم اخذ جزء قليل من الجهه اليمنا والجهه السفليه من النافذة ... لذلك لا تظهر اشرطة الـ Scrolls
لكنلي لا اعرف الحل Smile ...

وشكراً لحسن القراءة
الرد
#2
السلام عليكم ورحمة الله وبركاتة
وجدت حل مؤقت ... ومن رائيي انه غير سليم Smile
قمت بوضع مكون [ TScrollBox ] واعطيته خاصية
Align = alClient
ساستعمله إلى ان اجد الاجابة ...
الرد
#3
قلت كل شيئ و لم تحدد المكون الذي استعملته
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#4
قمت بإضافة الستاايل من خلال
Project -> Options -> Application -> Appearance : Turquoise Gray

وهذه المكتبات المستعملة [ Vcl.Themes, Vcl.Styles ]

ولا اضن اني استعملت مكون إلى الآن P:
الرد
#5
السلام عليكم ورحمة الله وبركاته
أخي ALmuhhnad هذه عبارة عن Bug .. قم بالتبليغ عنها في QualityCentral
----------------------
حاليا أمامك خيارين اما أن لا تستخدم ال Vcl Style على ال Non Client Area
PHP كود :
unit Unit1;

interface

uses
  Winapi
.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.Themes,Vcl.Styles, Vcl.StdCtrls;

  
type TFormStyleHookNC= class(TMouseTrackControlStyleHook)
  protected
    
procedure PaintBackground(Canvas: TCanvas); override;
    
constructor Create(AControl: TWinControl); override;
  
end;

type
  TForm1 
= class(TForm)
    
Memo1: TMemo;
    
procedure FormCreate(Sender: TObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1: TForm1;

implementation

{$R *.dfm}
 
constructor TFormStyleHookNC.Create(AControl: TWinControl);
begin
  inherited
;
  
OverrideEraseBkgnd := True;
end;

procedure TFormStyleHookNC.PaintBackground(Canvas: TCanvas);
var
  
Details: TThemedElementDetails;
  
R: TRect;
begin
  
if StyleServices.Available then
  begin
    Details
.Element := teWindow;
    
Details.Part := 0;
    
R := Rect(0, 0, Control.ClientWidth, Control.ClientHeight);
    
StyleServices.DrawElement(Canvas.Handle, Details, R);

  
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Self
.AutoScroll:=True;
end;

initialization
TStyleManager
.Engine.RegisterStyleHook(TForm1, TFormStyleHookNC);

end. 
كود :
http://im31.gulfup.com/JSBaU.png
الطريقة الثانية هي استخدام ال TScrollBar كما ذكرت أنت سابقا , لكن هناك مشكلة :
لون خلفية ال ScrollBar ليس مثل لون خلفية الفورم ...
كود :
http://im32.gulfup.com/sTMJA.png
أضف لذلك أن ScrollBar لديها بوردر سيؤثر على الفورم
كما أني وجدت Bug في ال ScrollBox عند تفعيل ال vcl Styles واسناد bsSingle لل BorderStyle
كود :
http://im31.gulfup.com/detWU.png
كود :
http://im34.gulfup.com/u4EqE.png
لكني استطعت التغلب على هذه المشاكل Big Grin باستخدام بعض الحيل !!

PHP كود :
unit Unit1;

interface

uses
  Winapi
.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.Themes,Vcl.Styles, Vcl.StdCtrls,
  
Vcl.CheckLst;

type TStyledScrollBox=class(TScrollBoxStyleHook)
private
FCanvas:TCanvas;
public
   
constructor Create(AControl: TWinControl); override;
   
destructor Destroy; override;
   
procedure DrawBorder; override;
   
procedure PaintBackground(Canvas: TCanvas); override;
   
procedure Paint(Canvas: TCanvas); override;

end;
type
  TForm1 
= class(TForm)
    
ScrollBox1: TScrollBox;
    
ListBox1: TListBox;
    
procedure FormCreate(Sender: TObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

end
;

{ 
TStyledScrollBox }

constructor TStyledScrollBox.Create(AControl: TWinControl);
begin
  inherited
;
   
Brush.Color := StyleServices.GetStyleColor(scWindow);
   
FCanvas:=TCanvas.Create;

end;

destructor TStyledScrollBox.Destroy;
begin
 FreeAndNil
(FCanvas);

  
inherited;
end;

procedure TStyledScrollBox.DrawBorder;
begin
 inherited
;
 
FCanvas.Handle:=GetWindowDc(Handle);
 
FCanvas.Brush.Color:=StyleServices.GetStyleColor(scWindow);
 
FCanvas.FrameRect(Rect(0,0,Control.Width,Control.Height));
 
FCanvas.FrameRect(Rect(1,1,Control.Width-1,Control.Height-1));

end;

procedure TStyledScrollBox.Paint(Canvas: TCanvas);
begin
  inherited
;

end;

procedure TStyledScrollBox.PaintBackground(Canvas: TCanvas);
begin
  inherited
;

end;

initialization
TStyleManager
.Engine.RegisterStyleHook(TScrollBox,TStyledScrollBox);
end. 
النتيجة النهائية :
كود :
http://im31.gulfup.com/s5IQb.png

و السلام عليكم ..
الرد
#6
Great ... ما شاء الله عليك ...
وجدت مشكلة اخرى في TStyle .... هههههه
ولم اجد لها حل Smile

وهي تكمن في إستعمال TStyle مع الـ DLL ... ساضعها في موضوع مستقل ...

بالمناسبة اخي SMP3 ... هل يوجد منهجية معينه لحل المشاكل كما فعلت انت ... ام بتحليل وترقيع الاخطاء باي طريقة كانت ؟

ايضاً لا اعرف كيف ابلغ عن Bugs ... ؟
ايضاً سؤال خارجي ... كم سيستغرق إصلاح الـ Bug ؟

مشكور من جديد ... وجزاك الله خير على المسااعدات التي قدمتها لي وبقية الاخوان

[ إلى الآن لم اجرب الحل الذي طرحته فانا لست على جهازي الآن ]
الرد
#7
ALmuhhnad كتب :Great ... ما شاء الله عليك ...
وجدت مشكلة اخرى في TStyle .... هههههه
ولم اجد لها حل Smile

وهي تكمن في إستعمال TStyle مع الـ DLL ... ساضعها في موضوع مستقل ...
سأطلع على الموضوع يوم الثلاثاء (يوم انتهاء امتحاناتي) Big Grin

إقتباس :بالمناسبة اخي SMP3 ... هل يوجد منهجية معينه لحل المشاكل كما فعلت انت ... ام بتحليل وترقيع الاخطاء باي طريقة كانت ؟
[COLOR="red"]نعم هناك منهجية :
أولا يجب أن تطلع على السورس الخاص بالمكون أو الاداة .. وتدقق معه ..
ثانيا يجب أن تقوم بوضع فرضيات عن أسباب المشكلة .. فالمشكلة لن تستطيع فهمها مالم تقم بوضع فرضيات منطقية !!
أخيرا حاول أن تعرف الفرضية الصحيحة ثم قم بماحولة لتصحيح المشكلة [/COLOR]

إقتباس :ايضاً لا اعرف كيف ابلغ عن Bugs ... ؟
[COLOR="red"]أولا لازم تكون مسجل في موقع http://edn.embarcadero.com/
ثانيا عندما تجد Bug ..قم بتشغيل ال Quality Central من دلفي : Tools->Quality Central
ضع ايميلك و الباسوورد الذي مسجل به في موقع embarcadero
اختر تصنيف للمشكلة Vcl ,FireMonkey,RTL... الخ
ثم قم بكتابة عن المشكلة أو ال Bug .. + ضع حل للمشكلة (ان قمت بالفعل بايجاد حل )
[/COLOR]
إقتباس :ايضاً سؤال خارجي ... كم سيستغرق إصلاح الـ Bug ؟
على حسب ال Bug .. في العادة يتم تصحيحها في ال Update التالي

إقتباس :مشكور من جديد ... وجزاك الله خير على المسااعدات التي قدمتها لي وبقية الاخوان

[COLOR="Gray"][ إلى الآن لم اجرب الحل الذي طرحته فانا لست على جهازي الآن
][/COLOR]
العفو أخي
الرد
#8
وعليكم السلام ورحمة الله وبركاتة
باارك الله فيك اخي واستاذي SMP3 .. الله يوفقك في إمتحاناتك

سؤال آخير واعتذر على الاطالة
عندما أبليغ عن Bug هل .. يتطلب ان تكون نسختي الـ XE3 شرعية ... !؟
الرد
#9
ALmuhhnad كتب :هل .. يتطلب ان تكون نسختي الـ XE3 شرعية ... !؟

لا أظن ذلك لأنها ليست هناك علاقة ب Bug وشرعية النسخة فأنت في الأخير تود تصليح الأخطاء
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد
#10
ALmuhhnad كتب :هل .. يتطلب ان تكون نسختي الـ XE3 شرعية ... !؟
لا ليس شرط .. لقد سبق وقمت بالتبليغ عن Bug باستخدام XE3 (نسخة مقرصنة Smile )
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم