Тема: Зміні та силки
Як одной зніной присвойть силку на іншу зміну (тип даних звісно однаковий)
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Зміні та силки
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Як одной зніной присвойть силку на іншу зміну (тип даних звісно однаковий)
Якщо я правильно вас зрозумів, то вам потрібні вказівники: http://www.transl-gunsmoker.ru/2009/09/blog-post.html
Є таке ключове слово - absolute. Але його не варто використовувати, та й не усі компілятори підтримують.
І якби ви наводили фрагменти коду і завдання, то на ваші питання було б значно легше відповідати.
Мені потрібно отримати вказівнпк на Form1.Caption;
var
p:^TCaption;
begin
p:=@Caption; //така ошибка Variable required
[Джедайський жест] вам не треба отримувати вказівник на Form1.Caption.[/Джедайський жест] Розкажіть, що вам треба - матимете відповідь.
Ну коротко.
Є глобальний масив у якому повині бути силки на заголовки компонентів на різних формах. Длятого щоб наприклад
Form1.button.caption:='545'; Form1.lebel.caption:='545';
неробить (ну і ще я неможу так звирнатися в коді, і підклю чення uses з потрібними формами мені тремба уникнути).
Ну коротко: якби ви навіть отримали такий масив, то ніц би воно вам не допомогло, тому що присвоювання властивості насправді викликає функцію перемалювання, а запис в пам'ять - ні.
Ви спробуйте не коротко: вам треба одночасно перейменовувати купу різних 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 := ...
Але чи воно спрацює - не певен. Раджу культурний спосіб... чи інші засоби розробки.
type TCaptionControl = class(TControl)
published
Caption: TCaption;//Error Published field 'Caption' not a class or interface type
end;
Так, звиняйте, це ж property:
type TCaptionControl = class(TControl)
published
property Caption;//тип і функції лишаються старими, ми перевизначаємо тільки доступ
end;
Терер не кородко.
Я вирішив зробити власну систему локалізацій (тобто власний велосепед).
Ідея полягає втому додавши в проект бібліотеку для локалізацій но саме най головнішете те щоб я міг додавати цю бібліотеку до інших проекті прицьму незмінюючи її.
Потім додавши на форму
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;
функція перебирає спилок який містить вказівники.
Я вирішив зробити власну систему локалізацій (тобто власний велосепед).
Ідея полягає втому додавши в проект бібліотеку для локалізацій но саме най головнішете те щоб я міг додавати цю бібліотеку до інших проекті прицьму незмінюючи її.
Ага, ясно.
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.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися