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

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: Kursist
Дата сообщения: 22.07.2009 16:41
Не понимаю, почему код не работал в первом случае!
Автор: Ramazan
Дата сообщения: 22.07.2009 19:21
Kursist
А как насчет:

Код:
TapSite = class(TCollectionItem)
private
FEmpty: Boolean;
FBuildingID:Integer;
public
property Empty: Boolean read FEmpty write FEmpty;
property BuildingID: Integer read FFBuildingID write FFBuildingID;
end;

TListSite=class(TCollection)
private
function GetItem(Id: Integer): TapSite;
procedure SetItem(Id: Integer; Value: TapSite);
public
function Add: TapSite;
property Items[Id: Integer]: TapSite read GetItem write SetItem; default;
end;
Автор: Kursist
Дата сообщения: 22.07.2009 19:53
Ramazan
Спасибо, ты привел очень хороший код.
И я так тоже делал, так как он позволяет контролировать введенные значения (более безопасный), но для очень простого класса мне не хотелось заморачиваться парами методов Get/Set.
(Можно считать, что я искал, точнее, вспоминал, альтернативный (менее безопасный) метод.
Автор: Ramazan
Дата сообщения: 22.07.2009 20:00
Kursist

Цитата:
альтернативный (менее безопасный) метод

Ну, если не ставилась задача написания собственной реализации списка, то можно вспомнить и обычные динамические массивы.
Автор: Frodo_Torbins
Дата сообщения: 23.07.2009 11:43
Kursist
Если делать с минимальными модификациями первоначального варианта, то наверно надо передавать ссылки на рекорды, а не сами рекорды.
Автор: spasius
Дата сообщения: 23.07.2009 20:45
Kursist
используй не записи а класс, пускай даже не CollectionItem, и свойства выведи через Property (read & write).
Автор: Kursist
Дата сообщения: 23.07.2009 22:30
Frodo_Torbins
spasius

Спасибо!
Сделал так:

PSite=^TapSite;

function TListSite.Items(ID: Integer): PSite;
begin
if (ID>0) and (ID<FItem.Count) then
Result:=@TSite(FItem.Items[ID]).Info;
end;

Тогда использование кода так как хотелось:

SitesList.Items(loop).Empty:=TRUE;
SitesList.Items(loop).BuildingID:=-1;

Данной реализации мне достаточно, так как мне не нужно было использование методов в классе.
Автор: rdenk1
Дата сообщения: 26.07.2009 06:28
Уважаемые программисты!
Есть dblookuplistbox, в нем отображаются значения поля таблицы БД (формат MS Access). Хотелось бы добавить возможность удаления из БД той записи, которая выделена в dblookuplistbox. Допустим, выделил запись (прямо в dblookuplistbox), нажал del на клавиатуре, соответствующая запись удалилась из базы (ну и из самого dblookuplistbox тоже, естественно). Как сделать такое?

Добавлено:
И еще хотелось бы убрать надоедающее сообщение database login при запуске программы. Используется Microsoft.Jet.OLEDB.4.0. Логин и пароль пустые и скорее всего так и будут пустыми, это не настолько секретная БД. А заставлять пользователей нажимать каждый раз это окно не хочется.
Автор: ShIvADeSt
Дата сообщения: 26.07.2009 06:45
rdenk1

Цитата:
И еще хотелось бы убрать надоедающее сообщение database login при запуске программы

LoginPrompt = False спасет тебя

Цитата:
Есть dblookuplistbox, в нем отображаются значения поля таблицы БД (формат MS Access).

у тебя лукап прикручен по идее к Table или Query. Вот при нажатии на кнопку удалить делай примерно так
MyQuery.Delete;
ну и после этого переоткрыть таблицу возможно понадобится.
Автор: rdenk1
Дата сообщения: 26.07.2009 07:58
Хорошо, а если таким же макаром нужно еще и добавить запись в таблицу (редактируестся запись в простом edit'е, таблица игрушечная и состоит всего из одного поля), то нужно ли для этого добавлять компонент query? А то у меня сейчас на форме только компоненты: ADOConnection, ADOTable, DataSource, DBLookupListBox. Или можно силами только этих компонентов внедрить запись?
Автор: ShIvADeSt
Дата сообщения: 26.07.2009 09:24
rdenk1
Не понимаю смысл гемороиться с едитом, когда есть DBEdit. Но если ты любишь на лыжах стоя, да еще и в гамаке - то вот так примерно добавлять запись в базу

Код:
Table1.Append;
Table1.FieldValues['ALPHANUMERIC'] := Edit1.text;
Table1.Post;
Автор: rdenk1
Дата сообщения: 26.07.2009 11:01

Цитата:
Не понимаю смысл гемороиться с едитом, когда есть DBEdit. Но если ты любишь на лыжах стоя, да еще и в гамаке - то вот так примерно добавлять запись в базу

Сложности меня только привлекают
А такой вопрос еще: когда я в edit'е на Enter нажимаю (обрабатывается добавление в БД), возникает стандартный звук Windows. Как бы его заблокировать (имеется в виду только для этого edit'а)?

Добавлено:
Я решил все-таки сделать с SQL. Поставил на форму компонент ADOQuery, отредактировал свойство SQL, запустил запрос, он выполнился. При этом свойство active у него было false, в течение всей работы. Это нормально?
И как скопировать результат работы SQL-запроса в "обычный" (не DB) компонент? В Listbox, например?
Автор: Grande
Дата сообщения: 26.07.2009 16:46

Цитата:
Прога заполняет БД всяческими инфами с обязательным указанием даты-времени. До некоторых пор все идет гладко. Но, вдруг, ни с того, ни с сего, сервер PostgreSQL возвращает ошибку о якобы недопустимом формате этой самой даты-времени.


Решил. Ежели кому интересно - вот причина:
В разделе initialization есть строка "ShortDateFormat := 'yyyy-mm-dd';".
Так вот, долбаный Symantec antivirus периодически меняет этот формат на другой!
Пришлось указывать дату в формате "26 July 2009", благо формат этот понимается всеми однозначно, да и реализация совсем простая.
Автор: Hiken
Дата сообщения: 27.07.2009 05:19
Grande
Это вы что хотите сказать, что антивирь меняет данные в памяти вашего приложения?
Автор: Ramazan
Дата сообщения: 27.07.2009 06:49
rdenk1

Цитата:
возникает стандартный звук Windows

Если используешь обработчик OnKeyPress, то добавь строку
Код: Key := #0;
Автор: Grande
Дата сообщения: 27.07.2009 06:52
Hiken
Разумеется, нет
Но, тем не менее, факты - упрямая вещь. Остановил антивирус - ни единого сбоя.
Автор: MrZeRo
Дата сообщения: 27.07.2009 13:03
Grande
Причина не собственно в антивирусе (я наблюдал, как и другие программы приводили к тому же эффекту), а в широковещательном сообщении WM_SETTINGCHANGE, которое по умолчанию обрабатывает Delphi-приложение и присваивает переменным значения из системных настроек, и к этому надо быть готовым.
Для того, чтобы от этого избавиться, можно использовать свойства TApplication, я обычно это делаю так:

Цитата:

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'My Cool Application';
Application.UpdateFormatSettings := False; //!! we don't want to update our format vars
Application.UpdateMetricSettings := False; //!! we don't want to update our system metrics vars
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;

Или же постоянно использовать функции преобразования согласно требуемого формата.
Автор: Grande
Дата сообщения: 27.07.2009 17:17
MrZeRo
Это для меня новость. Спасибо огромное!
Автор: rdenk1
Дата сообщения: 27.07.2009 19:35

Цитата:
Цитата:
возникает стандартный звук Windows

Если используешь обработчик OnKeyPress, то добавь строку
Код:
Key := #0;

Если OnKeyDown/OnKeyUp, то
Код:
Key := 0;


У меня на самом деле код такой:


Код: procedure block(Sender: TObject; var Key: Char);
var
vrLength: byte;
begin
with Sender as TEdit do
vrLength := Length(Text);
case Key of
'0'..'9','(',')':
begin
if (vrLength>7) then
Key := #0;
end;
#8: ;
else
Key := #0;
end;
end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
block(Sender,key);
end;
Автор: Ramazan
Дата сообщения: 28.07.2009 07:19
rdenk1

Код:
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
block(Sender,key);
if Key = #13 then Key := #0;
end;
Автор: rdenk1
Дата сообщения: 28.07.2009 15:18
Понятно. А такой вопрос: скачал недавно с torry компонент http://torry.net/pages.php?id=117 NextGrid называется. Ссылка:
NextGrid D7
Сильно понравилась демка, которая там была. Особенно панель внизу слева (с надписями Home, NextGrid и т. д.). Как называется подобная панель? Где можно подобное взять? Есть ли такое в DevExpress, и если да, то как называется?
Автор: Maks150988
Дата сообщения: 28.07.2009 15:29
Привет всем. Вот мне надо прописать маршрутизацию программно без всяких консольных извращений. Сразу оговорюсь, на XP работает - ну на своей рабочей системе проверял. Решил проверить на виртуалке, именно на системах 2000 и 7. Что-то вообще не прет там. Ну насчет семерки еще можно догадаться что происходит, но вот 2000. Вроде IP Helper пристуствует судя по MSDN в 2000. На вирртуалке даже под семеркой с запуском там с праваами администратора не прописывается - ну не появляется мой долгожданный мессаджбокс вслучае успешного результата функции. Служба роутинга там включена. Может кто подскажет как оптимальнее учесть все эти виста\семеровские заморочки, особенно с реестром и заодно опробуйте на системах у кого вин2000. Есть сомнения в правильности кода, инфы вообще мало, делал код практически на энтузиазме как мог.


Код: program resources;

{$APPTYPE CONSOLE}

uses
Windows, Messages, SysUtils, winsock;

type
PMIB_IPFORWARDROW = ^MIB_IPFORWARDROW;
MIB_IPFORWARDROW = record
dwForwardDest : DWORD;
dwForwardMask : DWORD;
dwForwardPolicy : DWORD;
dwForwardNextHop : DWORD;
dwForwardIfIndex : DWORD;
dwForwardType : DWORD;
dwForwardProto : DWORD;
dwForwardAge : DWORD;
dwForwardNextHopAS: DWORD;
dwForwardMetric1 : DWORD;
dwForwardMetric2 : DWORD;
dwForwardMetric3 : DWORD;
dwForwardMetric4 : DWORD;
dwForwardMetric5 : DWORD;
end;

type
IPAddr = Cardinal;

const
iphlpapilib = 'iphlpapi.dll';

function GetBestInterface(dwDestAddr: IPAddr; var pdwBestIfIndex: DWORD): DWORD; stdcall; external iphlpapilib name 'GetBestInterface';
function CreateIpForwardEntry(const pRoute: MIB_IPFORWARDROW): DWORD; stdcall; external iphlpapilib name 'CreateIpForwardEntry';

function RegWriteString(RootKey: HKEY; StrKey, StrName, StrVal: AnsiString): Boolean;
var
Dispos: DWORD;
RegKey: HKEY;
vSize : Integer;
RegRes: Integer;
begin
Result := FALSE;
vSize := Length(StrVal) + 1;
if (vSize < 0) then
Exit;
RegRes := RegCreateKeyEx(RootKey, PAnsiChar(StrKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, RegKey, @Dispos);
if (RegRes <> ERROR_SUCCESS) then
Exit;
Result := (RegSetValueEx(RegKey, PAnsiChar(StrName), 0, REG_SZ, PAnsiChar(StrVal), vSize) = ERROR_SUCCESS);
RegCloseKey(RegKey);
end;

function CreateIpEntry(Destination, Mask, Gateway: AnsiString): Boolean;
const
PersistentKey = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes';
var
pRoute : MIB_IPFORWARDROW; // структура
FuncRes : DWORD;
BestIndex: DWORD; // номер интерфейса
szRoute : AnsiString;
begin
Result := FALSE;
// сначала подставляем номер интерфейса как -1 и далее через функцию
// пытаемся определить лучший индекс интерфейса для маршрута
BestIndex := DWORD(-1);
FuncRes := GetBestInterface(inet_addr(@GateWay[1]), BestIndex);
case FuncRes of
// если функция вернула положительный результат, выполняем
// следующие действия
ERROR_SUCCESS:
begin
// заполняем структуру MIB_IPFORWARDROW, а также
// создаем запись через функцию и проверяем возвращаемый результат
// также проверяем значение маски подсети
if (Mask = '') then
Mask := '255.255.255.255';
ZeroMemory(@pRoute, SizeOf(MIB_IPFORWARDROW));
pRoute.dwForwardDest := inet_addr(@Destination[1]);
pRoute.dwForwardMask := inet_addr(@Mask[1]);
pRoute.dwForwardPolicy := 0;
pRoute.dwForwardNextHop := inet_addr(@Gateway[1]);
pRoute.dwForwardIfIndex := BestIndex;
pRoute.dwForwardType := 3;
pRoute.dwForwardProto := 3;
pRoute.dwForwardAge := 0;
pRoute.dwForwardNextHopAS := 0;
pRoute.dwForwardMetric1 := 1;
pRoute.dwForwardMetric2 := DWORD(-1);
pRoute.dwForwardMetric3 := DWORD(-1);
pRoute.dwForwardMetric4 := DWORD(-1);
pRoute.dwForwardMetric5 := DWORD(-1);
FuncRes := CreateIpForwardEntry(pRoute);
// если функция вернула положительный результат, выполняем
// следующие действия
case FuncRes of
NO_ERROR:
begin
szRoute := Format('%s,%s,%s,1', [Destination, Mask, Gateway]);
Result := RegWriteString(HKEY_LOCAL_MACHINE, PersistentKey, szRoute, '');
end;
//ERROR_ACCESS_DENIED,
//ERROR_INVALID_PARAMETER,
//ERROR_NOT_SUPPORTED:;
end;
end;
//ERROR_NOT_SUPPORTED,
//ERROR_CAN_NOT_COMPLETE:;
//else
// WriteLn(SysErrorMessage(GetLastError));
end;
end;

begin
if CreateIpEntry( '172.16.0.0' , '255.240.0.0' , '172.16.65.1' ) then
MessageBox(0, '', '', MB_OK);
end.
Автор: MrZeRo
Дата сообщения: 28.07.2009 16:45
Maks150988
Могут быть заморочки самой виртуалки, а не системы. Для чистоты эксперимента на живой машине с 2000/7 было бы интересно попробовать.
Автор: rdenk1
Дата сообщения: 30.07.2009 08:20
Кто-нибудь знает где можно скачать glyph'ы для кнопок и менюшек?
Автор: Rudia
Дата сообщения: 30.07.2009 08:25
rdenk1
http://www.google.com/search?q=скачать+иконки+бесплатно
И любой редактор, который позволяет сохранять в bmp и менять размер
Автор: ShIvADeSt
Дата сообщения: 30.07.2009 08:43
Rudia

Цитата:
И любой редактор, который позволяет сохранять в bmp и менять размер

Изменение размера не айс Вылазят артефакты в виде зубцов и искажение круглых форм.
rdenk1
На работе буду - у меня там есть ссылка на классный сайт с кучей картинок от самых мелких до 64х64 (мб и больше). Все 32 битные, очень красивые (на мой взгляд конечно).
Автор: MrZeRo
Дата сообщения: 30.07.2009 10:30
rdenk1
hТТp://www.torry.net/quicksearchd.php?String=icons&Title=Yes
hТТp://www.torry.net/pages.php?id=1527
Там есть платные, есть и бесплатные. Думаю, можно что-то подходящее подобрать.
Автор: Rudia
Дата сообщения: 30.07.2009 11:24
ShIvADeSt

Цитата:
Изменение размера не айс Вылазят артефакты в виде зубцов и искажение круглых форм.

Ну если изображения произвольные, то вероятность есть. Но в разных иконпаках стандарт идет обычно 128x128, либо 256x256. Они нормально ресайзятся.
А можно ещё пользовать Axialis Icon Workshop. Он замечательно это делает.
Автор: Frodo_Torbins
Дата сообщения: 30.07.2009 14:48
rdenk1
Тут еще гляньте: Иконки коммерческие (Сommercial Icons).
Автор: YuriyRR
Дата сообщения: 30.07.2009 16:46
Посмотри htp://www.board4all.cz/showthread.php?t=138576

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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