Тема: Зміні та силки

Як одной зніной присвойть силку на іншу зміну (тип даних звісно однаковий)

2

Re: Зміні та силки

Якщо я правильно вас зрозумів, то вам потрібні вказівники: http://www.transl-gunsmoker.ru/2009/09/blog-post.html

3 Востаннє редагувалося koala (19.08.2015 13:11:52)

Re: Зміні та силки

Є таке ключове слово - absolute. Але його не варто використовувати, та й не усі компілятори підтримують.
І якби ви наводили фрагменти коду і завдання, то на ваші питання було б значно легше відповідати.

4

Re: Зміні та силки

Мені потрібно отримати вказівнпк на Form1.Caption;

var
  p:^TCaption;
begin
  p:=@Caption; //така ошибка Variable required

5

Re: Зміні та силки

[Джедайський жест] вам не треба отримувати вказівник на Form1.Caption.[/Джедайський жест] Розкажіть, що вам треба - матимете відповідь.

Прихований текст

Caption - не змінна (variable), а властивість (property), вираз Form1.Caption := 'aaa' насправді замінюється Form1.SetText( 'aaa' ), і, відповідно, ви не можете отримати посилання на нього.

Подякували: Torbins, Stanislav Stecenko2

6

Re: Зміні та силки

Ну коротко.
Є глобальний масив у якому повині бути силки на заголовки компонентів на різних формах. Длятого щоб наприклад

Form1.button.caption:='545'; Form1.lebel.caption:='545';

неробить (ну і ще я неможу так звирнатися в коді, і підклю чення uses з потрібними формами мені тремба уникнути).

7

Re: Зміні та силки

Ну коротко: якби ви навіть отримали такий масив, то ніц би воно вам не допомогло, тому що присвоювання властивості насправді викликає функцію перемалювання, а запис в пам'ять - ні.
Ви спробуйте не коротко: вам треба одночасно перейменовувати купу різних TControl-ів. І ось тут ми стикаємося з *опою від розробників VCL: властивість TControl.Caption, яку успадковують всі Control-и, має обмеження protected. Якби не це, можна було б зробити

arr: array of TControl;

запхати в нього всі ваші Label-и, Button-и і Form-и і ходити по ньому тим самим циклом. Але, оскільки цього нема... кгм...
Культурний шлях від розробників виглядатиме, схоже, так: збираєте таки цей масив і робите

for .... do begin
  if arr[i] is TButton then arr[i] as TButton.Caption := ...
  else if arr[i] is TLabel then arr[i] as TLabel.Caption := ...
  else if arr[i] is TForm then arr[i] as TForm.Caption := ...
end;

Гадаю, це навіть можна ще спростити за допомогою RTTI (додати внутрішній цикл по типах).
Некультурний спосіб же, гадаю, буде проголосити

type TCaptionControl = class(TControl)
  published
    Caption: TCaption;
end;

і крутити

for .... do begin
  TCaptionControl(arr[i]).Caption := ...

Але чи воно спрацює - не певен. Раджу культурний спосіб... чи інші засоби розробки.

Подякували: Arete, Stanislav Stecenko, Torbins3

8

Re: Зміні та силки

type TCaptionControl = class(TControl)
  published
    Caption: TCaption;//Error Published field 'Caption' not a class or interface type
end;

9

Re: Зміні та силки

Так, звиняйте, це ж property:

    type TCaptionControl = class(TControl)
      published
        property Caption;//тип і функції лишаються старими, ми перевизначаємо тільки доступ
    end;

10

Re: Зміні та силки

Терер не кородко.
Я вирішив зробити власну систему локалізацій (тобто власний велосепед).
Ідея полягає втому додавши в проект бібліотеку для локалізацій но саме най головнішете те щоб я міг додавати цю бібліотеку до інших проекті  прицьму незмінюючи її.
Потім додавши на форму

TAutoLang.AddForm(F: TComponent);
procedure Tlist_form_name.FormCreate(Sender: TObject);
begin
  Lang.AddForm( list_form_name);
end;

процедура перебирає всі компоненти які моють Caption та Hint і додає їх в спилок який містить вказівники на адреси зміних Caption та Hint.
Коли мені потрібно змінити мову

property Languages: string write SetLanguages;

функція перебирає спилок який містить вказівники.

11 Востаннє редагувалося Torbins (20.08.2015 11:54:01)

Re: Зміні та силки

Stanislav Stecenko написав:

Я вирішив зробити власну систему локалізацій (тобто власний велосепед).
Ідея полягає втому додавши в проект бібліотеку для локалізацій но саме най головнішете те щоб я міг додавати цю бібліотеку до інших проекті  прицьму незмінюючи її.

Ага, ясно.
koala правий, список вказівників вам не допоможе, бо більшість контролів виконують додаткові дії при зміні Caption.
Робити

arr[i] is TButton

або

TCaptionControl(arr[i]).Caption

вам також не підійде, бо хороший локалізатор повинен вміти не тільки TButton і не тільки Caption.
Єдиний нормальний вихід з цієї ситуації - це використання RTTI. Причому починаючи з Делфі 2010 RTTI був значно розширений, тому краще одразу закладатися на Делфі 2010 і новіші. Що таке RTTI і як ним користуватися отут: Delphi 2010. RTTI и атрибуты (в тому ж блозі є переклади інших частин цієї серії).

P.S. Гляньте ще Screen.Forms і Screen.OnActiveFormChange.