كيفية عرض أشرطة التمرير في TsCrollbox بعد أن تم مرئيها مرة أخرى؟

StackOverflow https://stackoverflow.com/questions/2662974

  •  27-09-2019
  •  | 
  •  

سؤال

لقد واجهت مشكلة صغيرة واحدة. أقوم بتوليد بعض عناصر التحكم ديناميكيًا وأضعها على TScrollbox مكون. لكنني لاحظت أنه إذا كان Scrollbox مرئيًا ، يمكن للمستخدم رؤية كل من عناصر التحكم التي يتم إنشاؤها ووضعها بوضوح. لذلك يبدو أن الكثير من العمل يجري وهو بطيء.

لقد أخفيت مربعات التمرير وإنشاء جميع عناصر التحكم عليها ، والتي استغرقت وقتًا أقل بكثير ولا تفلت منها. لكن هذه هي المشكلة. عندما أعرض Scrollbox مرة أخرى ، لا يظهر شريط التمرير حتى أقوم بتغيير حجم النموذج فعليًا. (محاذاة Scrollbox alClient)

أي أفكار حول كيفية إصلاح هذا؟

حاول إعادة الطلاء ، لكنه لم ينجح. التحديث لم ينجح أيضًا.

شكرًا لك

تعديل:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;

يوضح الرمز أعلاه كيف أخفي وأظهر Scrollbox.
fNaujasTermas يولد لوحة مع العديد من أشرطة التعقب والصور والتعديلات.

لست متأكدًا من التفسير خطوة بخطوة قد يكون هناك. فقط قم بإجراء إجراء حيث يقوم بإنشاء بعض اللوحات مع العديد من عناصر التحكم عليه وتعيين Scrollbox كوالد. إخفاء Scrollbox قبل توليد أي شيء وإلغاء إلغاء كل شيء بعد كل شيء.
يا راجع للشغل ، يتم محاذاة اللوحة alTop. لذلك في كل مرة يتم فيها إنشاء لوحة جديدة ووضعها في Scrollbox ، ستظهر في الأعلى بينما ستتحرك جميع اللوحات الأخرى.

هذه هي الطريقة التي قمت بإنشائها Scrollbox نفسها

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;

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

حتى يعطي مثال. دعنا نقول أن لوحة واحدة لديها ارتفاع 200 بكسل.
ارتفاع Scrollbox هو 300 بكسل.

لذلك بعد إنشاء لوحين تضيف ما يصل إلى 400 بكسل من الارتفاع ، لا يظهر Scrollbox أشرطة التمرير ، على الرغم من أن نصف اللوحة الثانية غير مرئية. إذا قمت بإضافة لوحة أخرى = 600 بكسل ، فسيظهر Scrollbox شريط التمرير الذي يبدو أنه سيتم التمرير لكل لوحين فقط ، وليس 3. عند محاولة التمرير مثل هذه النافذة ، يتم إعادة حساب القيم ويظهر كل شيء بشكل جيد.

لذا فإن المشكلة الرئيسية هي كيفية جعل عرض Scrollbox Show "في الوقت المناسب" حتى لا يتم قطع أي لوحات؟

هل كانت مفيدة؟

المحلول

يمكنك طلب Scrollbox لإعادة حساب خصائص شريط التمرير عن طريق الاتصال Realign() الطريقة التي يرثها من TWinControl. لتقليل وميض ، يجب عليك القيام بذلك بينما لا يزال غير مرئي ، مثل ذلك:

ScrollBox.Visible := False;
try
  // create your new panel ...
finally
  ScrollBox.Realign;
  ScrollBox.Visible := True;
end;

نصائح أخرى

كما قلت في التعليقات ، أنا غير قادر على إعادة إنتاج المشكلة. سيساعد ذلك إذا أعطيت تعليمات خطوة بخطوة حول كيفية إعادة إنتاج المشكلة.

ولكن إذا قلت أن المشكلة تختفي إذا قمت بتغيير حجم النموذج ، فلماذا لا تقل حجم النموذج ببساطة؟ ربما يمكنك محاولة تغيير حجم 0 بكسل باستخدام SetWindowPos. قد تحاول أيضًا ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top