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

» Вопросы по Delphi (версии 2009, 2010 Weaver, 2011 Fulcrum)

Автор: XPerformer
Дата сообщения: 14.08.2012 18:24
A_V
Формулировка "можно" навевает на мысли о том, что очень многое можно сделать... вопрос - нужно ли тратить на это время? у меня лично все заказчики хотят, чтобы быстро и качественно. Если такой движок написан и отлажен (как правило, речь о команде разработчиков), то конечно, буду его использовать. Но писать движок, чтобы вынести формы на сервер (причем заказчик этот подвиг не только оценит и не заплатит, но даже и не заметит) - искусство ради искусства...
Автор: A_V
Дата сообщения: 14.08.2012 19:45
XPerformer
Ядро текущей системы, с которой я работаю, включает по-мимо прочего как-раз
подобную технологию. Проекту больше 10 лет, затрат около 100 человеко-лет.
Время показало, что это довольно удобно.

Новую версию системы разрабатываю тоже с похожим подходом - весь код на сервере
в oracle objects, запросы и лукапы во вьюхах.

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

Вобщем переходить на написание CRUD в дельфе совсем не тянет. разве что на ORM

C другой стороны видел систему, в которой формы (dfm'ки + FastScript) описывались строками в коде хранимых процедур(!!) - вот такое сопровождать врагу не пожелаешь

Добавлено:
так что
Цитата:
нужно ли тратить на это время?

тут каждый сам отвечает )
Автор: ant0ni02004
Дата сообщения: 15.08.2012 11:12
neznayka3

Цитата:
нельзя хранить тексты sql запросов на клиенте

ну не то чтобы совсем нельзя. есть такая схема, когда некоторые запросы (как правило - отчеты, хотя и не только они) хранятся в таблице вида "имя отчета";"запрос" и таким образом во многих случаях при изменении запроса не нужно заново компилировать программу

конечно, если под "нельзя хранить" имелись в виду вопросы безопасности (типа никому не показывать структуру БД) - это уже на усмотрение заказчика/разработчика
Автор: Frodo_Torbins
Дата сообщения: 15.08.2012 11:34
Samotek
Цитата:
а если запрос с разными колонками? Например нужны только розничные цены или остатки только из определенного подразделения? То есть запрос создается динамически. Столько вьюх не напишешь.
Чуть выше neznayka3 уже упомянул функции.

neznayka3
Цитата:
выборки напрямую из таблиц у меня нет, только view & functions.
В таком случае не стоит парится. В том топике не про ваш случай говорилось.

eddoc
Цитата:
А как по-вашему выглядел бы идеальный код в моем случае?
Я бы вынес из потока всю инициализацию в конструктор/деструктор потока. В этом случае она будет отрабатывать в основном потоке и синхронизация ввобще не понадобится. [more=Как то так.]
Код: constructor TMyThread.Create;
begin
inherited Create(False);

q:= 1;
FrmClr:= Form1.Color;

//меняем цвет, чтоб подлежащая форма отличалась от wait-формы
Form1.Color:= clMoneyGreen;

TimeCounter:= 0;
ListDisabled:= DisableTaskWindows(Form2.Handle);

Form2.Show;//покажем wait-форму
end;

destructor TMyThread.Destroy;
begin
EnableTaskWindows(ListDisabled);
ListDisabled:= nil;

Form2.Hide;
Form1.Color:= FrmClr;

inherited;
end;

procedure TMyThread.StopClick;
begin
Form1.BtnStopClick(Self);
end;
Автор: Dorami
Дата сообщения: 15.08.2012 12:20
Доброго дня.
Win 7 (64), Delphi 7, Delphi 2009 (12.0.3420.21218). Проинсталировал CnPack 0.9.9.621. В Delphi 7 сразу же появилось соответствующее меню. В Delphi 2009 никакого меню нет и при загрузке среды логотип CnPack не отображается. Как сделать, чтобы в Delphi 2009 тоже загрузился CnPack?
Спасибо.
Автор: XPerformer
Дата сообщения: 15.08.2012 14:53
Dorami
В папке с CnPack есть утилита Setup.exe
Позволяет одним махом отключить/включить CnWizards во всех инсталляциях Delphi.
setup.exe -i
или
setup.exe -u
Автор: Dorami
Дата сообщения: 15.08.2012 15:46
XPerformer

Цитата:
В папке с CnPack есть утилита Setup.exe

Запустил. Появилось окошко с текстом:

CnPack IDE-Мастер установлен в:
- Delphi 7
- RAD Studio 2009

но несмотря на это в Delphi 2009 нет ни пункта главного меню cnPack ни в главном меню какого-либо намека на его присутствие, ни в контекстном.
Автор: Frodo_Torbins
Дата сообщения: 15.08.2012 16:16
Dorami
Гляньте DelphiDistiller-ом что там 2009-я загружает.
Автор: Dorami
Дата сообщения: 15.08.2012 17:12
Frodo_Torbins

Цитата:
Гляньте DelphiDistiller-ом что там 2009-я загружает.

Загружаю Delphi посредством DelphiDistiller как Ok and Run Delphi 2009 - загружается CnPack и не загружаются все сторонние компоненты такие как эх, фибы и т.д.
Загружаю Delphi посредством запуска через ярлык - Не загружается CnPack и загружаются все сторонние компоненты.

Автор: eddoc
Дата сообщения: 15.08.2012 18:00
Frodo_Torbins

Цитата:
Я бы вынес из потока всю инициализацию в конструктор/деструктор потока. В этом случае она будет отрабатывать в основном потоке и синхронизация ввобще не понадобится.

Я тоже пришел к этому же выводу, когда прикрутил поток в реальном проекте. Там TThread.Update вообще не понадобился, т.к. вся анимация удивительно легко реализовалась в основном потоке.

Да, за код спасибо. Познавательно
Автор: Frodo_Torbins
Дата сообщения: 16.08.2012 11:41
Dorami
Похоже в свойствах ярлыка указана загрузка альтернативной конфигурации из реестра.
Автор: neznayka3
Дата сообщения: 16.08.2012 14:26
сейчас каждый тип данных редактируется в своем модуле - контрагенты в своем, заказы в своем и тд. вся обработка происходит в дата-модулях. но начальство с юзерами хотят добавлять все отовсюду. например, в форме заказа добавить/изменить контрагента, добавить новое значение справочника, посмотреть остатки... можно конечно подцепить дата-модуль и вызывать оттуда функции, но не нравится, что будет куча ссылок друг-на друга. как правильно?
Автор: eddoc
Дата сообщения: 18.08.2012 10:15
neznayka3

Цитата:
как правильно?

ActionList не подойдет?
Автор: neznayka3
Дата сообщения: 18.08.2012 15:26
eddoc
нет. и так все через них. например, если изменять контрагентов из разных модулей, надо передавать id контрагента, те одна и та же функция вызывается с разными параметрами, из разных actions.
Автор: ant0ni02004
Дата сообщения: 18.08.2012 23:09
neznayka3

Цитата:
будет куча ссылок друг-на друга

т.е. нормально что из заказа, например, можно и контрагента создать, и новый товар добавить итд, а вот что в коде тоже самое будет - ненормально?

можно это всё вынести в отдельный модуль
у него одного будет куча ссылок на остальные, а вот у остальных будет только ссылка на него
в самом модуле - функции типа AddContragent, EditContragent, DelContragent, AddPart, .....
каждая к соотв. модулям обращается

можно пойти еще дальше, и в initialization каждого модуля прописывать самоё себя куда нибудь в список, а из других модулей вызывать что-то типа DoVerb('AddContragent')

Автор: eddoc
Дата сообщения: 22.08.2012 09:51
Комрады, подскажите

Пытаюсь затолкать картинки в экзешник. Помещаю картинки в файл png_img_src.rc

Код: PngImage_1 RCDATA "pict_135_135\\medic_01.png"
PngImage_2 RCDATA "pict_135_135\\medic_02.png"
PngImage_3 RCDATA "pict_135_135\\medic_03.png"
PngImage_4 RCDATA "pict_135_135\\medic_04.png"
Автор: Frodo_Torbins
Дата сообщения: 22.08.2012 12:38
eddoc
Picture создаст Graphic только после того, как загрузит картинку, а до этого он Nil. Поэтому нужно сначала загрузить ресурс в TPngImage, а потом Assign-ом в Picture.
Автор: A_V
Дата сообщения: 22.08.2012 13:48
Frodo_Torbins
либо просто перед этим создать ImgSplash.Picture.Graphic := TWICImage.Create;
но LoadFromResourceName в любом случае лучше
Автор: eddoc
Дата сообщения: 22.08.2012 22:26
A_V, Frodo_Torbins

Про nil мне ребята на скруле подсказали. В этом [more=куске кода]

Код: var
PngImg: TPngImage;
ImgSplash: TImage;
begin
PngImg:= TPngImage.Create;
try
PngImg.LoadFromResourceName(HInstance, 'PNGIMAGE_1');
ImgSplash.Picture.Graphic:= PngImg;
finally
FreAndNil(PngImg);
end;
end;
Автор: Eternal_Shield
Дата сообщения: 22.08.2012 22:42
eddoc
а чем ImgSplash.Picture.Assign(PngImg) не угодил? имхо, так более корректно.
Автор: eddoc
Дата сообщения: 23.08.2012 16:31
Eternal_Shield
Те же йайца, только сбоку

зы. У меня к Assign весьма настороженное отношение. Наверное я просто не умею ее готовить.

зыы. тоже возьму на заметку.
Автор: jFobos
Дата сообщения: 24.08.2012 19:04
не в ту тему сообщение написал, как удалить?
Автор: neznayka3
Дата сообщения: 27.08.2012 07:52
на всех диалоговых формах по 2 кнопки - "Сохранить" и "Отменить". народ хочет при добавлении заказа сразу его распечатать. сейчас им надо сначала жать на "Сохранить" - при этом форма закроется, и только потом распечатать. если при печати сделаю сохранение данных, то смысл в кнопках "Сохранить" и "Отменить" теряется. как быть?

можно сделать кнопку "Сохранить" без закрытия формы, а "Отменить" сменить на "Закрыть". можно как в 1С навешать кучу кнопок.

Добавлено:
пока добавил
Код: if Application.MessageBox
('Перед печатью данные необходимо сохранить. Продолжить?', 'Печать',
MB_ICONQUESTION + MB_YESNO) = IDYES then
Автор: eddoc
Дата сообщения: 27.08.2012 11:08
neznayka3
можно добавить кнопку "печать", либо изменить текст запроса типа "Распечатать?" и оставить 2 кнопки "Да" и "Нет". Ведь по логике данные все равно должны сохраняться
Автор: Bonivur
Дата сообщения: 01.09.2012 21:07
Где можно почитать на русском основы работы в FireMonkey? Например, интересую такие вопросы как - какие файлы нужны на компьютере конечного пользователя для запуска программы написанной с использованием FireMonkey, системные требования... Вобщем, любая полезная информация по данной библиотеке и принципы работы с ней.
Автор: Frodo_Torbins
Дата сообщения: 01.09.2012 22:33
Bonivur
По www.delphifeeds.ru поиском пройдитесь. Там было несколько серий от русскоязычных блогеров.
Правда сейчас уже читая такие статьи нужно оглядываться на XE3 с ее FireMonkey2.
Автор: Bonivur
Дата сообщения: 01.09.2012 23:16

Цитата:
Правда сейчас уже читая такие статьи нужно оглядываться на XE3 с ее FireMonkey2

Вторая обезяна на подходе? )) Может так подождать ХЕ3 и уж покопаться тогда основательней... а то много отзывов что сыро всё весьма. Спасибо за ссылку!
Автор: Frodo_Torbins
Дата сообщения: 01.09.2012 23:47
Bonivur
Я думаю, что многие вещи останутся без особых внешних изменений, хотя внутри могут поменяться очень сильно. Особенно стоит обратить внимание на посты Всеволода Леонова. Как работник Эмбаркадеро, он наверняка заранее знал, что будет переделано, а что останется таким же, и темы для постов подбирал соответственно.
Автор: rrromano
Дата сообщения: 02.09.2012 15:16
eddoc

Я писал когда-то небольшой модуль на тему красивых ресурсов. Для одной из предыдущих версий Дельфей. В последней, наверное, уже не надо так ухищряться.


Код: // Summary:
// Модуль класса, расширяющего стандартный TImageList для корректной работы с
// PNG-изображениями.
// Copyright:
// © 2011 R. O.
// Version:
// 0.1
// Remarks:
// Расширение корректно работает только в Windows XP и более поздних версиях.

unit PImageList;

interface

uses
Classes, SysUtils, Windows, Graphics, Controls, ImgList, CommCtrl, PngImage;

type
TPImageList = class(TImageList)
function AddPngFromResByID(ResID: integer): integer;
function AddPngFromFile(const FilePath: string): integer;
function AddPng(Png: TPngImage): integer;
public
constructor Create(AOwner: TComponent); override;
constructor CreateCopy(AOwner: TComponent; ASource: TImageList);
protected
procedure DoDraw(Index: integer; Canvas: TCanvas; X, Y: integer;
Style: cardinal; Enabled: boolean = true); override;
end;

implementation

constructor TPImageList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;

// Summary:
// Конструктор копирования
constructor TPImageList.CreateCopy(AOwner: TComponent; ASource: TImageList);
begin
inherited Create(AOwner);
AllocBy := ASource.AllocBy;
BkColor := ASource.BkColor;
BlendColor := ASource.BlendColor;
ColorDepth := ASource.ColorDepth;
DrawingStyle := ASource.DrawingStyle;
Height := ASource.Height;
ImageType := ASource.ImageType;
Masked := ASource.Masked;
ShareImages := ASource.ShareImages;
Width := ASource.Width;
Tag := ASource.Tag;
AddImages(ASource);
end;

// Summary:
// Перегруженная процедура, расширяющая базовую для корректной прорисовки
// неактивных изображений.
procedure TPImageList.DoDraw(Index: integer; Canvas: TCanvas; X, Y: integer;
Style: cardinal; Enabled: boolean);
var
Options: TImageListDrawParams;

function GetRGBColor(Value: TColor): cardinal;
begin
Result := ColorToRGB(Value);
case Result of
clNone:
Result := CLR_NONE;
clDefault:
Result := CLR_DEFAULT;
end;
end;

begin
if Enabled or (ColorDepth <> cd32Bit) then
inherited
else if HandleAllocated then
begin
FillChar(Options, SizeOf(Options), 0);
Options.cbSize := SizeOf(Options);
Options.himl := Self.Handle;
Options.i := Index;
Options.hdcDst := Canvas.Handle;
Options.X := X;
Options.Y := Y;
Options.cx := 0;
Options.cy := 0;
Options.xBitmap := 0;
Options.yBitmap := 0;
Options.rgbBk := GetRGBColor(BkColor);
Options.rgbFg := GetRGBColor(BlendColor);
Options.fStyle := Style;
Options.fState := ILS_SATURATE; // Grayscale for 32bit images

ImageList_DrawIndirect(@Options);
end;
end;

// Summary:
// Функция добавления изображения в формате PNG из ресурсов.
// Params:
// ResID - индекс изображения в ресурсах.
// Returns:
// Индекс первого нового изображения в случае успеха или -1 в случае провала.
function TPImageList.AddPngFromResByID(ResID: integer): integer;
var
Png: TPngImage;
ResStream: TStream;
Bitmap: TBitmap;
begin
ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
try
Png := TPngImage.Create;
try
Png.LoadFromStream(ResStream);
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Png);
Result := Add(Bitmap, nil);
finally
FreeAndNil(Bitmap);
end;
finally
FreeAndNil(Png);
end;
finally
FreeAndNil(ResStream);
end;
end;

// Summary:
// Функция добавления изображения в формате PNG из файла.
// Params:
// FilePath - путь к файлу.
// Returns:
// Индекс первого нового изображения в случае успеха или -1 в случае провала.
function TPImageList.AddPngFromFile(const FilePath: string): integer;
var
Png: TPngImage;
Bitmap: TBitmap;
begin
Png := TPngImage.Create;
try
Png.LoadFromFile(FilePath);
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Png);
Result := Add(Bitmap, nil);
finally
FreeAndNil(Bitmap);
end;
finally
FreeAndNil(Png);
end;
end;

// Summary:
// Функция добавления изображения в формате PNG.
// Params:
// Png - изображение.
// Returns:
// Индекс первого нового изображения в случае успеха или -1 в случае провала.
function TPImageList.AddPng(Png: TPngImage): integer;
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Png);
Result := Add(Bitmap, nil);
finally
FreeAndNil(Bitmap);
end;
end;

end.
Автор: eddoc
Дата сообщения: 02.09.2012 23:23
rrromano
Спасибо. Правда, для PNG изображений я пользую готовый PNGImage. Просто, в моем случае нужно нужно было в цикле перебрать картинки, а как их достать из PNGImageList я что-то не придумал (доки для этого компонента тоже не нашел) вот сохранить прозрачность фона при извлечении их из ImgList'а у мея пока не получилось

Добавлено: надо же, а ларчик просто открывался

Код: PNGImgLst1.GetIcon(n,img1.Picture.Icon);

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: Установка копоненты ZipTV


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