С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
1

Как у объекта объявить поле типа TStringList

31.10.2023, 20:19. Показов 807. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я предполагаю что создание полей типа TStringList в объекте Config следует производить в конструкторе, но пока до этого не дошел. Возможно и в этом случае будет ошибка.

Если поле PanelNameFull объявить строковым то строку можно безпроблем присвоить, но потом в программе прийдеться заморачиваться, поэтому хотелось бы сразу список.

Создаю основной объект Config далее его поле Config.PanelNameFull.Create и уже ему (типа TStringList ) присваиваю строку в свойство DelimitedText.

Выдает ошибку нарушение записи в адрес....

Как объявить поле типа TStringList у объекта и записать туда данные?



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
  
  TConfig = class(TObject)
  public
    PanelNameFull : TStringList;
    FieldNameFull : TStringList;
  end;
---------
 
 
Config := TConfig.Create; // Создаем объект конфигурации
  Config.PanelNameFull.Create;
  Config.PanelNameFull.DelimitedText := 'D, FL, RL';
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2023, 20:19
Ответы с готовыми решениями:

Объявить класс, содержащий поле целого типа две константы, задающие допустимый диапазон
задание такое :5. Объявить класс, содержащий поле целого типа две константы, задающие допустимый...

MFC: 2 класса, невозможно объявить поле в классе 2 типа первого класса.
Подскажите, пожалуйста, в чем ошибка Есть 1 й класс: class time { int h; int m; }

Как добавить текст в список типа TStringList
Здравствуйте. Мне необходимо добавить произвольный текст в список типа TStringList. Так как текст...

Как перенести переменную типа TStringList в другой модуль
Как перенести глобальную переменную типа TStringList в другой модуль (Unit2 например), чтобы она...

Как из объекта класса TStringList взять первое по порядку значение, не зная его значения?
Как из объекта класса TStringList взять первое по порядку значение, не зная его значения :) и затем...

22
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
31.10.2023, 20:31 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type
  TConfig = class 
  private
    FPanelNameFull, FFieldNameFull: TStringList;
  public
    constructor Create; dynamic;
    destructor Destroy; override;  
  public
    property PanelNameFull: TStringList read FPanelNameFull;
    property FieldNameFull: TStringList read FFieldNameFull;
  end;
  
implementation
 
constructor TConfig.Create;
begin
  inherited;
  FPanelNameFull:= TStringList.Create();
  FPanelNameFull.DelimitedText := 'D, FL, RL';
  // и т.д.
end;
 
destructor TConfig.Destroy;
begin
  FPanelNameFull.Free();
  inherited;
end;
1
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
31.10.2023, 20:32 3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 TConfig = class(TObject)
  public
    PanelNameFull : TStrings;//TStringList не запрещается, но так выше ур. совместимости.
    FieldNameFull : TStrings;
    constructor Create;
    destructor Destroy;
  end;
---------
 
constructor TConfig.Create;
begin
inherited;
PanelNameFull:=TStringList.Create;
FieldNameFull:=TStringList.Create;
Config.PanelNameFull.DelimitedText := 'D, FL, RL';
end; 
 
destructor TConfig.Destroy;//Убивать поля Пушкин будет?
begin
PanelNameFull.Free;
FieldNameFull.Free;
inherited;
end;
 
Config := TConfig.Create; // Создаем объект конфигурации
Может все-таки почитать хотя классику, вроде Фаронова? Я и сейчас считаю лучшей Валерий Фаронов: "DELPHI. Программирование на языке высокого уровня: Учебник для вузов"
Подробнее: https://www.labirint.ru/books/85147/

Правда, у меня более раннее издание по Delphi 7 и по юникоду с дженериками я уже потом читал в оригинале Марко Кэнту Delphi 2009 Handbook
1
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
31.10.2023, 20:36 4
Примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TConfig = class(TObject)
  protected
    FPanelNameFull : TStringList;
    FFieldNameFull : TStringList;
  public
    constructor Create;
    destructor Destroy;
    property PanelNameFull: TStringList read FPanelNameFull;
    property FieldNameFull: TStringList read FFieldNameFull;
  end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TConfig }
 
constructor TConfig.Create;
begin
  inherited;
  FPanelNameFull := TStringList.Create;
  FFieldNameFull := TStringList.Create;
end;
 
destructor TConfig.Destroy;
begin
  FPanelNameFull.Free;
  FFieldNameFull.Free;
  inherited;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  c: TConfig;
begin
  c := TConfig.Create;
  c.PanelNameFull.DelimitedText := 'D, FL, RL';
/// Работа с объектом
 
  c.Free; // Или FreeAndNil(c);
end;
 
end.
И лучше описание этого класса вынести в отдельный модуль.
1
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
31.10.2023, 20:38 5
Цитата Сообщение от Beltar Посмотреть сообщение
Delphi
15
Config.PanelNameFull.DelimitedText := 'D, FL, RL';
???
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
31.10.2023, 20:50  [ТС] 6
Спасибо.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
31.10.2023, 20:52 7
Цитата Сообщение от AzAtom Посмотреть сообщение
???
Копипаста не стертая.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
31.10.2023, 21:02  [ТС] 8
А можно спросить почему мы у свойства пишем только read FPanelNameFull. Я просматривал главу и пару статей в интернете по созданию объектов там встречается такой пример;
Delphi
1
property Active: Boolean read FActive write SetActive;
Почему мы не написали:
Delphi
1
property PanelNameFull: TStringList read FPanelNameFull write FPanelNameFull;
Обозначая что запись и чтение из свойства идут напрямую, без дополнительных процедур. Почему не указав write у меня все равно получилось присвоить значения PanelNameFull.
0
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
31.10.2023, 21:04 9
Цитата Сообщение от S0563506 Посмотреть сообщение
А можно спросить почему мы у свойства пишем только read FPanelNameFull.
Это просто пример. Если хочется присваивать свойству левые объекты, то можно замутить и write. Всё зависит от того, чего ты хочешь от класса.

Добавлено через 58 секунд
Цитата Сообщение от S0563506 Посмотреть сообщение
Почему не указав write у меня все равно получилось
Патамушта это указатель.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
31.10.2023, 21:20 10
Что касается property вообще, то это механизм предназначенный в первую очередь для свойств редактируемых визуально в редакторе. Если это не требуется, то можно и в public писать, не оформляя пропку и read write. Более того, иногда пропка может вводить в заблуждение, однажды я так очень больно сел на гвоздь, из-за того, что рискнул предположить, что свойство connected у TCP-клиента проверяет какую-то внутреннюю переменную, а оно на самом деле лезет на на подключение.

Применение property для невизуальных свойств может быть удобно, если пишется какой-то сложный сеттер, который может установить значение, а может и не установить. Хотя и в этом случае можно не делать пропку, а просто написать геттер, даже если он примитивный, и сеттер, и вызывать их напрямую, а само поле засунуть в private.
0
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
31.10.2023, 22:06 11
Цитата Сообщение от S0563506 Посмотреть сообщение
почему мы у свойства пишем только read FPanelNameFull
А зачем туда что-то записывать? Объект сам создаёт внутренний объект и сам его уничтожает. Лезть внутрь просто нет смысла, потому и только read.

Вообще, property существует/отображается исключительно для удобства программиста. На самом деле идёт либо обращение напрямую к полю, если в read/write указано само поле, либо идёт вызов соответствующего сеттера/геттера.

Цитата Сообщение от S0563506 Посмотреть сообщение
Почему не указав write у меня все равно получилось присвоить значения PanelNameFull.
Вот так?
Delphi
1
    property PanelNameFull: TStringList read FPanelNameFull;
и далее в коде
Delphi
1
2
3
4
5
var
  c: TConfig;
  sl: TStringList;
begin
  c.PanelNameFull := sl;
Так компилятор не даст скомпилировать. Это тоже одна из функций свойства - не давать лезь куда не нужно.
0
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,475
01.11.2023, 01:29 12
Цитата Сообщение от Beltar Посмотреть сообщение
Что касается property вообще, то это механизм предназначенный в первую очередь для свойств редактируемых визуально в редакторе. Если это не требуется, то можно и в public писать, не оформляя пропку и read write.
Не совсем так или точнее совсем не так. Механизм property придуман для работы со сложными структурами как с простой переменной. Для редактирования в дизайнере придумана секция publised.
И я пока что не увидел/не понял зачем ТСу этот лист нужен как property.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
01.11.2023, 08:06 13
В коде ничто не мешает писать так:

Delphi
1
2
3
4
5
6
TMyClass=class
private
  FValue:Integer;
public
  GetValue:Integer;
  SetValue(Value:Integer);
А в редакторе свойств доступа к процедуркам нет, и их надо явно привязать.

Единственный плюс свойства в коде, помимо сокращения имени, если оно записано так

Delphi
1
2
3
4
5
6
7
TMyClass=class
private
  FValue:Integer;
  GetValue:Integer;
  SetValue(Value:Integer);
public
  property Value:Integer read FValue write SetValue;
Сразу видно, что чтение происходит напрямую и копировать в промеж. переменную при множественных обращениях ненужно.

Но если я пишу
Delphi
1
MyClass.Value:=X;
То это совсем не означает, что после данного оператора MyClass.Value=X; и такой код выглядит контринтуитивно.
0
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
01.11.2023, 08:11 14
Beltar, Да задолбал ты. Сразу видно, что ты не пишешь больших и сложных программ с заделами на будущее.

Как у объекта объявить поле типа TStringList


Когда создаёшь иерархию классов глубокой вложенности, без свойств будет совсем хреново. Небольшой пример (чисто поглазеть):
Вложения
Тип файла: 7z uPciIsaBridge.7z (31.1 Кб, 7 просмотров)
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
01.11.2023, 11:29 15
1) Любой метод имеет свои ограничения применимости и свои затраты.

2) Написание больших и сложных программ ни на форумах, ни в базовых книгах не рассматривается. Я тебя пойму, почему ты делаешь так, ТС тебя не поймет. Вот объясни ему, почему ты маркируешь override и dynamic, и что означает ошибка "Can't override static method". И твоя правильность без понимания, почему ты делаешь именно так, летит в пустоту.

3) Задел на будущее может быть абсолютно любым. И доведен до абсурда.

4) Код мы пишем все-таки не абстрактный, а с конкретными целями, это может быть крохотный класс, который нужен только в конкретном проекте, а может быть библиотека со сложной иерархией наследования. И да, даже примитивнейшую структуру наследования из 3 классов:
TBaseClass=class
TDescendantClass1=class(TBaseClass)
TDescendantClass2=class(TBaseClass)

правильно сделать может быть сложно.

5) Лично у меня уже давно к программистским догмам сложилось отношение, как к шутке из КВН еще кажется 90-ых:
- Как будет по-татарски "вперед"?
- Алга.
- А как будет по-татарски "назад"?
- У нас нет слова "назад", мы разворачиваемся и "Алга!"

Уж какие только программистские практики не вводят, от написания кода и новых языков, до организации работы, одни отменяют и тут же "Алга" в другие. Вот только тормозность программ растет быстрее производительности железа, и я видел софт, который лучше всего характеризуется, как "горе от ума". Что же касается механизма property, то я в своем определении могу сослаться на Свердлова Сергея Залмановича. Кто мы, и кто он? И он тоже особого смысла в property не видит вне визуального программирования.

Поэтому, позвольте ограничиться чисто синтаксической правильностью.

Добавлено через 2 минуты
И действительно, что-то мне подсказывает, что я на этот форум трачу слишком много времени.
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
01.11.2023, 17:24 16
Цитата Сообщение от Beltar Посмотреть сообщение
Написание больших и сложных программ ни на форумах, ни в базовых книгах не рассматривается. Я тебя пойму, почему ты делаешь так, ТС тебя не поймет. Вот объясни ему, почему ты маркируешь override и dynamic, и что означает ошибка "Can't override static method". И твоя правильность без понимания, почему ты делаешь именно так, летит в пустоту.
Очень правильное замечание! Затраченные усилия по написанию софта не должны превышать полезный выхлоп от этого софта.
0
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
01.11.2023, 17:47 17
Цитата Сообщение от Constcat Посмотреть сообщение
Затраченные усилия по написанию софта не должны превышать полезный выхлоп от этого софта.
А,... ну ладно тогда.
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
01.11.2023, 18:14 18
Цитата Сообщение от Verevkin Посмотреть сообщение
А,... ну ладно тогда.
Есть такое понятие "Глюку полировать". Это когда сроки уже подошли, софт сдавать нужно, а программер увлечен оптимизацией и пр. рефакторингом.
0
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
01.11.2023, 18:29 19
Цитата Сообщение от Constcat Посмотреть сообщение
Есть такое понятие "Глюку полировать". Это когда сроки уже подошли, софт сдавать нужно, а программер увлечен оптимизацией и пр. рефакторингом.
У меня так не бывает.
Я пишу софт для управления оборудованием и тестирования этого оборудования. Под каждую железку - отдельная одноразовая программа. Каждая одноразовая программа на 90% состоит из многоразовых независимых частей, которые я постоянно совершенствую. Благодаря этому никакие дедлайны мне никогда не грозят - девайс, который мы производим (его прошивка МК и ПЛИС), и программа управления, которую пишу я, создаются и отлаживаются совместно. А унификация независимых частей исходника позволяет собирать из них живой черновик буквально за 1-2 рабочих дня.

Такова специфика моей работы. Ничего личного.

З.Ы. За это мне платят неплохие деньги, кстати.
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
01.11.2023, 19:00 20
Цитата Сообщение от Verevkin Посмотреть сообщение
У меня так не бывает.
Цитата Сообщение от Verevkin Посмотреть сообщение
Такова специфика моей работы. Ничего личного.
Это все понятно. Но программисты бывают разного уровня. И я говорил о ситуации, когда программист пытается улучшить свой уровень за счет рабочего времени и во вред срокам сдачи.
0
01.11.2023, 19:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2023, 19:00
Помогаю со студенческими работами здесь

Неясности с TStringList. Как найти наибольший элемент в TStringList?
Добрый день. Проблема следующая: мне надо в TStringList найти самую длинную строчку. Пытаюсь...

Можно ли объявить переменную не как тип, а как свойство какого-либо объекта
Сегодня впервые сел за c# (по работе нужно) решил состряпать простенький калькулятор, в событии...

Как объявить переменные байтового типа?
Извините, если я задаю тупые вопросы, но я недавно начал изучать Visual C++. Список вопросов: 1)...

Как объявить переменную типа Region?
Задался задачей сделать форму элипсоидной формы: {$reference System.Windows.Forms.dll} ...

Статическое поле абстрактного класса в как наследуемое поле и преведение его типа
public abstract class BaseManager : BaseClass { public static BaseManager Instance {...

Как объявить и заполнить массив типа string?
Подскажите, как объявить и заполнить массив типа string? (заполнить словами вводимыми с клавиатуры)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru