Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: Tartrout
Дата сообщения: 28.02.2007 11:30
RomanTim

1. Assign - это метод наследников TPersistent. А у меня структура.

2. Даже если я использую этот метод, это не будет перегружать присваивание.

Я хочу, чтобы когда в коде встречается выражение A := B, то вызывалась бы моя функция. Так же, как я это могу сделать на C++. Как я понимаю, даже если метод Assign написан, он не будет вызываться в этом контексте. Или я неправ?

vshersh

Ах, коллега...

OdesitVadim

Вы, видимо, не прочитали оригинальный (мой) реквест. Перегружать арифметические операторы я умею, спасибо большое. Вопрос в том, как перегрузить оператор присваивания. Его нет в списке разрешенных к перегрузу:

The following table shows the Delphi operators that can be overloaded:

[more]Implicit
Conversion
Implicit(a : type) : resultType;
implicit typecast

Explicit
Conversion
Explicit(a: type) : resultType;
explicit typecast

Negative
Unary
Negative(a: type) : resultType;
-

Positive
Unary
Positive(a: type): resultType;
+

Inc
Unary
Inc(a: type) : resultType;
Inc

Dec
Unary
Dec(a: type): resultType
Dec

LogicalNot
Unary
LogicalNot(a: type): resultType;
not

BitwiseNot
Unary
BitwiseNot(a: type): resultType;
not

Trunc
Unary
Trunc(a: type): resultType;
Trunc

Round
Unary
Round(a: type): resultType;
Round

Equal
Comparison
Equal(a: type; b: type) : Boolean;
=

NotEqual
Comparison
NotEqual(a: type; b: type): Boolean;
<>

GreaterThan
Comparison
GreaterThan(a: type; b: type) Boolean;
>

GreaterThanOrEqual
Comparison
GreaterThanOrEqual(a: type; b: type): resultType;
>=

LessThan
Comparison
LessThan(a: type; b: type): resultType;
<

LessThanOrEqual
Comparison
LessThanOrEqual(a: type; b: type): resultType;
<=

Add
Binary
Add(a: type; b: type): resultType;
+

Subtract
Binary
Subtract(a: type; b: type) : resultType;
-

Multiply
Binary
Multiply(a: type; b: type) : resultType;
*

Divide
Binary
Divide(a: type; b: type) : resultType;
/

IntDivide
Binary
IntDivide(a: type; b: type): resultType;
div

Modulus
Binary
Modulus(a: type; b: type): resultType;
mod

ShiftLeft
Binary
ShiftLeft(a: type; b: type): resultType;
shl

ShiftRight
Binary
ShiftRight(a: type; b: type): resultType;
shr

LogicalAnd
Binary
LogicalAnd(a: type; b: type): resultType;
and

LogicalOr
Binary
LogicalOr(a: type; b: type): resultType;
or

LogicalXor
Binary
LogicalXor(a: type; b: type): resultType;
xor

BitwiseAnd
Binary
BitwiseAnd(a: type; b: type): resultType;
and

BitwiseOr
Binary
BitwiseOr(a: type; b: type): resultType;
or

BitwiseXor
Binary
BitwiseXor(a: type; b: type): resultType;
xor

No operators other than those listed in the table may be defined on a class or record.[/more]
Автор: RomanTim
Дата сообщения: 28.02.2007 13:44
Tartrout

Цитата:
Assign - это метод наследников TPersistent. А у меня структура

А я и написал, что для своих классов можно сделать, TPersistent тут совсем не причем.
С перегрузкой для классов... Дело в том, что в делфи переменная типа класс это указатель (статических экземпляров класса в делфи не бывает) и перегружать для нее например оператор присваивания я не совсем представляю как.
Автор: Tartrout
Дата сообщения: 28.02.2007 14:22
RomanTim

Я не нуждаюсь в перегрузке оператора присваивания для класса. Мне вполне достаточно для структуры. Вызывать метод Clone это убожество. Я, положим, не забуду, что его надо вызвать. А другой программист, пользующийся моими структурами, напишет присваивание, и будет очень плохо


Цитата:
Дело в том, что в делфи переменная типа класс это указатель (статических экземпляров класса в делфи не бывает) и перегружать для нее например оператор присваивания я не совсем представляю как.


Если не совсем представляете, то рекомендую книжку Бьерна Страуструпа "Язык программирования С++". То что для указателя можно перегрузить оператор присваивания - само собой очевидно. Более того, это довольно часто делается. Иначе как, по-Вашему, работают смартпоинтеры?

Господи, почему я вынужден писать на этом пиджин-паскале??? (Плачет, утираясь рукавом)
Автор: vserd
Дата сообщения: 28.02.2007 14:43
offtopic
Tartrout

Цитата:
Господи, почему я вынужден писать на этом пиджин-паскале???

Карма у тебя такая, и сильно не стони, а то войну спровоцируешь. :(((((((
Автор: Tartrout
Дата сообщения: 28.02.2007 14:49
offtopic
vserd

Всё-всё. Собрался уже. Порядок.
Автор: xy
Дата сообщения: 28.02.2007 21:37
Вы вот мне только честно скажите - этот 2007, это полноценная штуковина, на нее можно положиться?? или лучше подождать BDS2007?
Мы разрабатываем принципиально только вин32 приложения (нужна совместимость с виндовсом 98) и в .нет смысла нет, но является ли д2007 нормальной тулзой

или это полуфабрикат, глючащий похуже бдс2006 (стыдно сказать, чего стоят его постоянные вылеты)

и вообще как там со стратегией, они будут делать ставку на бдс или всё-таки появятся вновь нормальные раздельные продукты?
Автор: xitsmex
Дата сообщения: 28.02.2007 23:38

Цитата:
Свойства вообще-то предполагают не столько хранение, сколько необходимость в определенных действиях при задании-получении значения, а здесь классу датасет нужен на всем времени жизни, причем задается он только один раз - самое то через параметр конструктора задать.
Хм. Имхо в свойстве - красИвее - имено так поступают, например, с DataSource. И это универсальнее - когда то нам может понадобится сменить этот самый DataSet. А вот под этим:

Цитата:
а как порекомендаете например сохранять настройки-состояние фрейма?
я понял настройки рода: положение, свойства обработки и прочее, которые, имхо, лучше хранить в свойствах.
Автор: xy
Дата сообщения: 01.03.2007 00:32
[всхлипнул, потёр нафик ибо флуд :)]
Автор: murkovich
Дата сообщения: 01.03.2007 01:46
xy
Насчет совместимости с 98 - кажется, недавно где то читал, что они наконец решились постепенно избавляться от балласта, который связан с 98. (Источник не помню.) Но, если 98 важна, то вряд ли имеет смысл модернизироваться на 2007 или новее.

Все-таки, раньше или позже, но юникоду быть, а юникод и 98 - вещи трудно совместимые.

Вот, одну цитату нашел -
Цитата:
Delphi for Win32 is the only IDE that supports creating native code applications compatible with Windows 2000, XP, AND Vista. Delphi for Win32 not only allows you to develop on all three platforms, but also lets you deploy for any of the three.
- там, правда, не говорится "не будет работать на 98", но и не обещается.
Автор: xy
Дата сообщения: 01.03.2007 02:10
murkovich
ну понятно, хотя Вин32 АПИ со времен 98-го не особо менялся :)
проблема в баговитости жуткой бдс2006 и тлеет слабая надежда что в 2007 такое поправили
хотя конечно вряд ли.. как начало оно с дельфи8 глючить.. так неизвестно когда закончит - еще есть мысли мигрировать на ТурбоДелфи, но что-то мне подсказывает что та среда слабовата для наших задач, а попробовать нет возможности, т.к. в соотв ветке сказали, что поставить турбо параллельно с бдс нельзя :-/

Добавлено:
спасибо большое за цитату
Автор: RomanTim
Дата сообщения: 01.03.2007 07:02
xitsmex

Цитата:
Хм. Имхо в свойстве - красИвее - имено так поступают, например, с DataSource. И это универсальнее - когда то нам может понадобится сменить этот самый DataSet

Свойство для датасета разумеется не помешает сделать, но передавать значение, обязательное для функционирования класса, через параметр конструктора на мой взгляд тоже симпатично, хотя все это уже вкусовщина и непосредственно к делфи отношения не имеет

По поводу настроек - человек спрашивал не как их хранить на этапе выполнения (если я понимаю правильно там будут какие-нибудь настройки сортировки, фильтрации и т.п. - а они так или иначе уже хранятся в свойствах дочерних для фрейма объектов), а как их запоминать чтобы новосозданный фрейм мог их восстановить. И это можно сделать и в деструкторе, и в BeforeDestruction, и просто сделав метод SaveSettings с вызовом его в нужном месте формы... Все на усмотрение разработчика, главное что бы работало
Автор: ArtemiyUO
Дата сообщения: 01.03.2007 07:16
xy
Я конечно понимаю что это офтоп, но все же.
Немогли бы вы привести список нескольких самых неприятных багов в бдс2006 вин32?
Я работаю в ней очень плотно уже больше года и не испытваю практически никаких серьезных проблем.
Автор: xitsmex
Дата сообщения: 01.03.2007 09:28
RomanTim
Полностью согласен.
Автор: xy
Дата сообщения: 01.03.2007 10:12
ArtemiyUO
Основное:
1. редкое закрытие среды (практически никогда, если открыт проект какой-нить) не заканчивается шквалом "Application Error" и "Разрушительных сбоев"
2. часто во время работы случаются вылеты "corebpl....dll" и т.п. что иногда да приводит к неработоспособности среды.. вот например вчерась вылетела очередня дллка и перестала работать навигация кнопками %) тока буквы вводи :):)

глючит часто, я бы сказал постоянно
есть подозрения на варезную версию, но есть и большие сомнения что из-за этого

ЗЫ. правда делфи еще приправления такой "стабильной" тулзой как JEDI VCS, но лучшей бесплатной альтернативы найти не удалось :-/ бдез неё никак, хотя возможно она тоже помогает глюкавому делу
Автор: qwedr
Дата сообщения: 01.03.2007 10:29
xy
Лично у меня на 3 разных компьютерах (правда ставил всегда с одного диска) ни разу не вылетала (кроме шуток), чего не скажу о Delphi 7. Вам надо либо искать другую копию программы, либо попробовать ОС переставить - может из-за неё?

Единственное что беспокоит - панельки. Расставляю каждый раз как мне удобно, закрываю. А при новом запуске все опять по-умолчанию. Кто-нибудь может подсказать как исправить? Думаю где-то должна быть возможность сохранить раскладку панелек, но сам не нашел пока что.
Автор: RomanTim
Дата сообщения: 01.03.2007 10:32
ArtemiyUO
А можно я пожалуюсь!!!
То что вспомнилось с лету:
1. Периодически начинает жрать память и тормозить, если съела больше полугига - можно перезапускать с чистой совестью
2. Иногда вылетают ексепшены в coreide.dll
3. При работе с библиотеками типов (КОМ) глючит по черному (то пас не пересоздает, то не сохраняет, то опять же ексепшены)
4. Не особо гладко работает на двухмониторной системе (если поселить на второй монитор)

xy
А вот то, что поправят глюки, как то слабо верится - у них в квалити центре есть критические ошибки, которые по году и больше висят, и никто особо не чешется. И вообще его бывает интересно поглядеть
http://qc.codegear.com/wc/qcmain.aspx?da=1
Автор: xy
Дата сообщения: 01.03.2007 11:22
qwedr

Цитата:
либо попробовать ОС переставить - может из-за неё?

переставлялась много раз, работает на лицензионных ХРях ;)
релиз один из первых, от ShockISO патченый, 4диска..

RomanTim

Цитата:
2. Иногда вылетают ексепшены в coreide.dll

да, несколько разных иногда вылетает
а еще оно иногда тупо не видит файл проекта - пока не открыть в среде рядышком - ругается на uses :-/
Автор: dmit000
Дата сообщения: 01.03.2007 14:49
Всем привет.

Мне нужна помощь
Часть кода проектика на котором произошёл затык и краткое описание
проблемы (файл Вопрос.txt) можно скачать по адресу http://slil.ru/24012116
файл: Вопрос.exe 106,827 байт

Ответ прошу Вас прислать в виде дописанного кода в моей программке
на мой адрес dmit30@ngs.ru или текстовкой в форум.

Автор: murkovich
Дата сообщения: 01.03.2007 15:41
xy

Цитата:
ну понятно, хотя Вин32 АПИ со времен 98-го не особо менялся

Не совсем согласен. Да, те части, которые были уже в 98, почти не менялись. Но не так уж мало новых возможностей добавилось после 98. Если всё время оставаться при наибольшем совместном делителе всех 32-битных виндоус, т.е., на уровне 98 или даже 95, то мы сильно связываем себе руки.

Примером служит хотя бы тот самый юникод.

Ясно, что всё еще имеются желающие пользоватъся 98, но с точки зрения "общественной" пользы я одобяю решение отказаться от тормоза в виде требования 100% совместимости с 98.

Но в итоге, скорее всего, как среда разработки 98 отпадает сама по себе, а как целевая среда все-таки остается. Возможно, при соблюдении некоторых условий по используемым компонентам/функциям. (имхо)
Автор: RomanTim
Дата сообщения: 01.03.2007 16:01
dmit000
Посмотрел твою прогу... На мой взгляд 10, 100 и даже 1000 строк - это далеко не критично для объема одного юнита. Выносить в другой юнит разумно те вещи, которые могут использоваться из нескольких других, ну или реализацию некоего класса, как вещи в себе.

Но если так хочется можно сделать [more=модуль]unit Unit2;

interface

uses
StdCtrls;

procedure FillComboBox(CB: TComboBox, Txt: string);

implementation

procedure FillComboBox(CB: TComboBox, Txt: string);
begin
CB.Clear;
if Txt = '2' then begin
CB.Items.Add('0,25');
CB.Items.Add('0,4');
end else if Txt = '2,5' then begin
CB.Items.Add('0,35');
CB.Items.Add('0,45');
end;
end;

end.[/more] с процедурой FillComboBox, подключить его в uses первого, и вызывать из обработчика ComboBox1Change эту процедуру:
FillComboBox(ComboBox2, ComboBox1.Text);
Автор: dmit000
Дата сообщения: 01.03.2007 16:22
RomanTim

Спасибо.

Только я не понял где и как в юните 1 объявлять
написанную тобой процедуру FillComboBox

Ответь пожалуйсто
Автор: RomanTim
Дата сообщения: 01.03.2007 18:33
dmit000
А ее не надо объявлять - добавляешь unit2 в uses в unit1:

unit unit1;
interface
uses ....., unit2;

и в результате в первом юните видно все, что объявлено в interface-секции второго
Автор: dmit000
Дата сообщения: 01.03.2007 19:25
RomanTim

Всё сделал как ты сказал. не работает. ругается в юните2

на строки:
procedure FillComboBox(CB: TComboBox, Txt: string); (две строки)

пише на обе строки:
[Error] Unit2.pas(8): ';', ')' or '=' expected but ',' found


Добавлено:
RomanTim

Всё заработала прога. Метод тыка помог (TComboBox;)

RomanTim спасибо.

Добавлено:
Создал на форме кнопку Button1 и PopupMenu1
При нажатии на правую кнопку мышки на кнопке Button1 - появится этот PopupMenu1.

Вопрос:
как сделать так чтобы при нажатии на кнопку Button2 левой кнопкой мышки появлялся PopupMenu1?
Автор: RomanTim
Дата сообщения: 01.03.2007 22:44
dmit000
С процедурой действительно ошибся - разделитель параметров это ;

С менюшкой по левой кнопке
procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
begin
p := Mouse.CursorPos;
PopupMenu1.Popup(p.X, p.Y);
end;
Автор: dmit000
Дата сообщения: 02.03.2007 05:25
RomanTim

Спасибо. Я бы никогда так не придумал.

А вот скажи пожалуйсто. Процедуру FillComboBox можно написать без параметров?
Автор: RomanTim
Дата сообщения: 02.03.2007 07:00
dmit000
Написать то можно... если во втором юните сослаться на первый (uses в implementation) и обращаться Form1.ComboBoxN.
Только все это ведет исключительно к корявости. Выносить в процедуру, да еще и в другой модуль, код, который потом обращается к определенным объектам первого модуля, да еще и вызывается в одном единственном месте - глупо.
Если это лаба в курсе по паскалю еще хоть как-то можно понять, да и то лучше сразу учиться разумно писать, а если реальный проект... чуть вырастет и все станет совсем запутанно и нечитаемо
Автор: xy
Дата сообщения: 02.03.2007 09:25
murkovich

Цитата:
Но в итоге, скорее всего, как среда разработки 98 отпадает сама по себе, а как целевая среда все-таки остается. Возможно, при соблюдении некоторых условий по используемым компонентам/функциям.

согласен, но клиент всегда прав
именно поэтому мне нравится идея делфи и обещанный простой переход на .Нет.. т.е. мы ведем проект с пом. современных разработок от Борланда (Кодегира) и когда ХР будет примерно в таком же положении как сейчас 98-й сможем довольно просто перейти на .Нет

RomanTim

Цитата:
1000 строк - это далеко не критично для объема одного юнита

поддерживаю.. имею несколько юнитов по 2-3 тысячи в проекте с общим количиством ккомпилируемых строк - до 250к
Автор: dmit000
Дата сообщения: 02.03.2007 10:51
RomanTim

Это не лаба по паскалю. Просто я теряюсь в этом обилии процедур в одном юните и захотел их разделить. Возможно это пройдёт, но не думаю.

Спасибо за помощь.


И ещё: кто занет как зарегистрировать компанент F1book в дельфи 4 (или 6 или 7)?
Автор: xy
Дата сообщения: 02.03.2007 11:38
dmit000
Unit - логическая единица, ей надо управлять
для удобства в делфи методы можно сворачивать/рпазворачивать
а еще есть директива {$INCLUDE} ;)
Автор: murkovich
Дата сообщения: 02.03.2007 11:49
xy

Цитата:
согласен, но клиент всегда прав

Ну да, да, клиент всегда прав. Но, если интересы двух групп клиентов взаимно исключающие (ладно, мешающие друг другу), и доля одной группы составляет в лучшем случае 5%, да и то в стране, где софт чаще "берут" чем покупают, то ситуация с точки зрения Кодегира почти ясна.

Но это ведь не мешает вам ждать момента, когда Виста станет стандартом, и тогда переходить на, скажем, Delphi 2008 и .NET - привязка ведь в основном к VCL, и не к конкретной версии IDE.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.