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

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

Автор: Odysseos
Дата сообщения: 16.02.2010 21:35
MegoChelovek

Во-первых, ругается-то тут не компилятор, а уже выполняющаяся программа, так?

Во-вторых - на что именно ругается? Текст сообщения какой?

В-третьих - прям навскидку видно, что функция obrezanie будет работать совершенно некорректно, если запятой во введенной строке нет вообще.
Автор: zakov
Дата сообщения: 16.02.2010 23:54

Цитата:
так вот когда я в Эдит ввожу отрицательное число, то компилятор начинает ругаться...как быть ?


У меня такой вот код ошибки не вызывает:

Код:
function obrezanie(S: string; Count: Integer): String;
var
N: Integer;
begin
N:=Pos(',', S);
if N> 0 then begin
N:=N+Count;
Result:=Copy(S, 1, N);
end else
Result:=S;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
koordX, x0 : integer;
begin
x0 := 0;

koordX:= x0+round((strtofloat(obrezanie(Edit1.Text,1)))*40);
label1.Caption:=intTostr(koordX);
end;
Автор: Man Without Face
Дата сообщения: 17.02.2010 09:21
Доброго времени суток. Вопрос по dbChart:
Диаграмма из двух кривых, нужно добавить третью (сложить первую со второй). Возможно ли это и как это можно реализовать? По иксу время от 0ч до 24ч, по игрику значения. Заранее благодарен. Код создания диаграммы: [more]
procedure TChartBuild.Chart18;
var count_product,i,j,kol:integer;
bar_ser1, bar_ser2, bar_ser3:TFastLineSeries;
begin
if vid_rep=1 then
begin
ShowChart(2);
Chart.View3D:=false;
Chart.Legend.Visible:=true;
bar_ser1:=TfastLineSeries.create(Chart);
bar_ser1.Marks.Style:=smsValue;
Chart.AddSeries(bar_ser1);
bar_ser1.LinePen.Width:=2;
bar_ser2:=TfastLineSeries.create(Chart);
bar_ser2.Marks.Style:=smsValue;
Chart.AddSeries(bar_ser2);
bar_ser2.LinePen.Width:=2;
bar_ser3:=TfastLineSeries.create(Chart);
bar_ser3.Marks.Style:=smsValue;
Chart.AddSeries(bar_ser3);
bar_ser3.LinePen.Width:=2;

if type_rep=3 then //день
begin
Chart.Title.Text.Add('Динамика потребления клиентами топлива и услуг '+_('on')+' '+DateToStr(dat_beg));

qryTemp.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' +
't.rc_hourrealiz_saletype in(1, 3) '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';
qryTemp.Open;
for i:=0 to 24 do
begin
if i=qryTemp.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser2.Add(qryTemp.FieldByName('rc_hourrealiz_count').Asfloat,inttostr(i),clGreen);
qryTemp.Next;
end
else
bar_ser2.Add(0,inttostr(i),clGreen);
end;
bar_ser2.Title := 'Юридические лица';
//qryTemp.Close;

qryTemp2.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' +
't.rc_hourrealiz_saletype = 2 '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';
qryTemp2.Open;
for i:=0 to 24 do
begin
if i=qryTemp2.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser1.Add(qryTemp2.FieldByName('rc_hourrealiz_count').Asfloat,inttostr(i),clRed);
qryTemp2.Next;
end
else
bar_ser1.Add(0,inttostr(i),clRed);
end;
bar_ser1.Title := 'Физические лица';
//qryTemp2.Close;
//end;

qryTemp3.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' + 't.rc_hourrealiz_saletype in (1,2,3) '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';
qryTemp3.Open;
qryTemp.Close;
qryTemp2.Close;
qryTemp.Open;
qryTemp2.Open;
qryTemp.first;
qryTemp2.first;
for i:=0 to 24 do
begin
if i=qryTemp3.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser3.Add((qryTemp.FieldByName('rc_hourrealiz_count').Asfloat + qryTemp2.FieldByName('rc_hourrealiz_count').Asfloat),inttostr(i),clBlack);
qryTemp.Next;
qryTemp2.Next;
qryTemp3.Next;
end
else
bar_ser3.Add(0,inttostr(i),clBlack);
end;
bar_ser3.Title := 'Общее';
qryTemp.Close;
end;
end;
end;
[/more]
Автор: Eyrikh
Дата сообщения: 17.02.2010 09:51
Man Without Face
Может быть, в одном цикле по времени (часам) выбирать данные каждым запросом с построением графиков, полученные значения складывать, построение общего графика и т.д. по циклу (по шкале времени )
Автор: Man Without Face
Дата сообщения: 17.02.2010 10:06
Что то похожее пробовал [more] if type_rep=3 then //день
begin
Chart.Title.Text.Add('Динамика потребления клиентами топлива и услуг '+_('on')+' '+DateToStr(dat_beg));

qryTemp.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' +
't.rc_hourrealiz_saletype in(1, 3) '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';

qryTemp2.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' +
't.rc_hourrealiz_saletype = 2 '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';

qryTemp3.SQL.Text:= 'select t.RC_HOURRealiz_hour,' +
'avg(t.rc_hourrealiz_count) as rc_hourrealiz_count '+
'from berlio.RC_HOURRealiz t, berlio.RC_SMENADATES n'+
' where n.rc_sd_object in ('+AZS+')'+
' and t.RC_HOURRealiz_date =' +DateToSQL(dat_beg)+
' and n.rc_smenadates = t.RC_HOURRealiz_shift and ' + 't.rc_hourrealiz_saletype in (1,2,3) '+
'group by t.RC_HOURRealiz_hour '+
'order by t.RC_HOURRealiz_hour ';

qryTemp.Open;
qryTemp2.Open;
qryTemp3.Open;
for i:=0 to 24 do
begin
if i=qryTemp.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser2.Add(qryTemp.FieldByName('rc_hourrealiz_count').Asfloat,inttostr(i),clGreen);

end
else begin
bar_ser2.Add(0,inttostr(i),clGreen);
end;

if i=qryTemp2.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser1.Add(qryTemp2.FieldByName('rc_hourrealiz_count').Asfloat,inttostr(i),clRed);

end
else begin
bar_ser1.Add(0,inttostr(i),clRed);
end;

if i=qryTemp3.FieldByName('RC_HOURRealiz_hour').AsInteger then
begin
bar_ser3.Add((qryTemp.FieldByName('rc_hourrealiz_count').Asfloat + qryTemp2.FieldByName('rc_hourrealiz_count').Asfloat),inttostr(i),clBlack);
qryTemp.Next;
qryTemp2.Next;
qryTemp3.Next;
end
else begin
bar_ser3.Add(0,inttostr(i),clBlack);
end;


end;

bar_ser2.Title := 'Юридические лица';
bar_ser1.Title := 'Физические лица';
bar_ser3.Title := 'Общее';
[/more]. Вообще ерунду строит.

Добавлено:
Если бы что то похожее было: bar_ser3.add(bar_ser1 + bar_ser2);

Добавлено:
Всем спасибо, все сделал
Автор: MegoChelovek
Дата сообщения: 17.02.2010 15:06
Спасибо, щас попробую исправить

Добавлено:
zakov
Спасибо за obrezanie (смешно звучит ) щас всё работает корректно

Всем спасибо за помощ !

P.S. только вот почему программа раньше выдавала исключение типа EConverError я так и не понял
Автор: jonikDk
Дата сообщения: 17.02.2010 16:39
MegoChelovek

Цитата:
P.S. только вот почему программа раньше выдавала исключение типа EConverError я так и не понял

ну так ошибка была при конвертировании из одного типа в другой
Автор: MegoChelovek
Дата сообщения: 17.02.2010 16:54
jonikDk
нудопустим в поле я вводил отрицательное число, strtofloat преобразовывала в вещ тип ......блин...кажеться я врубилсо....если запятой не было, то получалось что у меня только знак "-" копировался....ну из этого и исключение..

Вот и поговорил сам с собой
Автор: Man Without Face
Дата сообщения: 18.02.2010 15:59
Всем привет. Делаю экспорт в dbf при помощи Halcyon6. Файл создается с полями но они все пустые, подскажите пож. что не так делаю?.

Код:
[more]
unit frmExport;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, cxLookAndFeelPainters, StdCtrls, cxButtons,
DBTables, DB, Halcn6db;

type
TfExport = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
cxBtnOk: TcxButton;
cxBtnCancel: TcxButton;
HDS: THalcyonDataSet;
qExportDbf: TQuery;
SDexportDbf: TSaveDialog;
qExportDbfrc_sd_begindate: TDateTimeField;
qExportDbfrc_sd_object: TFloatField;
qExportDbfrc_smenar_producttype: TFloatField;
CHDS: TCreateHalcyonDataSet;
procedure cxBtnOkClick(Sender: TObject);
procedure cxBtnCancelClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fExport: TfExport;

implementation

{$R *.dfm}

procedure TfExport.cxBtnCancelClick(Sender: TObject);
begin
Close;
end;

procedure TfExport.cxBtnOkClick(Sender: TObject);
var
SaveCursor: TCursor;
begin
if SDexportDbf.Execute then
begin
SaveCursor := Screen.Cursor;
Screen.Cursor := crHourglass;

HDS.Active := false;
HDS.DatabaseName := ExtractFilePath(SDexportDbf.FileName);
HDS.TableName := ExtractFileName(SDexportDbf.FileName);

//CHDS.CreateFields.Clear;
CHDS.CreateFields.Add('SHIFTDATE;d;8;0');
CHDS.CreateFields.Add('EMTCODE;n;5;0');
CHDS.CreateFields.Add('AZSCODE;n;5;0');
CHDS.CreateFields.Add('OILCODE;n;5;0');
CHDS.Execute;

HDS.Active := true;
hds.Open;
qExportDbf.Close;
qExportDbf.Open;
//ShowMessage(inttostr(qExportDbf.FieldByName('rc_sd_object').AsInteger));
while qExportDbf.Eof do
begin
hds.Append;


hds.FieldByName('SHIFTDATE').AsDateTime := qExportDbf.FieldByName('rc_sd_begindate').AsDateTime;
//hds.FieldByName('EMTCODE').AsInteger := 640;
hds.FieldByName('AZSCODE').AsInteger := qExportDbf.FieldByName('rc_sd_object').AsInteger;
hds.FieldByName('OILCODE').AsInteger := qExportDbf.FieldByName('rc_smenar_producttype').AsInteger;

hds.Post;
//showmessage(inttostr(hds.FieldByName('azscode').AsInteger));
hds.Next;
end;



qExportDbf.Close;
hds.Active := false;
Screen.Cursor := SaveCursor;
end
else;
end;

procedure TfExport.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Release;
fExport := nil;
end;

end.
[/more]
Автор: jonikDk
Дата сообщения: 18.02.2010 16:45

Код:
while qExportDbf.Eof do
begin
hds.Append;


hds.FieldByName('SHIFTDATE').AsDateTime := qExportDbf.FieldByName('rc_sd_begindate').AsDateTime;
//hds.FieldByName('EMTCODE').AsInteger := 640;
hds.FieldByName('AZSCODE').AsInteger := qExportDbf.FieldByName('rc_sd_object').AsInteger;
hds.FieldByName('OILCODE').AsInteger := qExportDbf.FieldByName('rc_smenar_producttype').AsInteger;

hds.Post;
//showmessage(inttostr(hds.FieldByName('azscode').AsInteger));
hds.Next;
end;
Автор: Odysseos
Дата сообщения: 18.02.2010 19:14
Man Without Face

while qExportDbf.Eof do заменить на while not qExportDbf.Eof do

hds.Next; заменить на qExportDbf.Next;
Автор: jonikDk
Дата сообщения: 18.02.2010 19:31
Odysseos
блин ну неужели все надо разжевывать, я специально не написал решение, чтобы человек подумал и сам нашел свои ошибки ...
Автор: Odysseos
Дата сообщения: 19.02.2010 05:20
jonikDk

В шапке топика:

2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
Автор: Man Without Face
Дата сообщения: 19.02.2010 08:12
jonikDk
Odysseos
Спасибо большое, я затупил нереально...
Автор: jonikDk
Дата сообщения: 19.02.2010 08:26
Odysseos
ну и где я не по сути ответил ??? я указал на конкретные две ошибки.
Автор: zakov
Дата сообщения: 20.02.2010 22:36
Уважаемые! Подскажите кто как использует автоинкрементные поля?
Есть клиент-серверный проект с использованием Midas. Идея в том, чтобы пользователь вводил виртуальный документ со строками данных. Запись нового документа и данных грида документа (формы) производится в базу данных после заполнения грида и нажатия по кнопке сохранить.
Значения ключевого поля ClientDataSet заполняются вызовом процедуры базы данных, считывающей значение генератора в базе данных, после чего генератор инкременируется.
Так вот проблема в чем... Если пользователь нажимает кнопку отмена, документ не сохраняется и сгенирированные значения теряются, т.е. выпадают из последовательности в базе данных...
Как сделать так, чтобы значения генерировались в базе данных при записи данных???
Стандартно создал триггер и пробовал разными способами и не получается, что в общем-то логично:
- если ключевое поле оставлять пустым, компилятор ругается на пустое поле;
- если заполнять нулями - ругается на неуникальное значение ключевого поля.

Подскажите, пожалуйста, решение!!!
Автор: volser
Дата сообщения: 20.02.2010 23:03

Цитата:
и сгенирированные значения теряются, т.е. выпадают из последовательности в базе данных...

И чем это плохо? А если удалить документ, то значения не теряются?
Автор: zakov
Дата сообщения: 20.02.2010 23:27

Цитата:
И чем это плохо? А если удалить документ, то значения не теряются?


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

Добавлено:
А есть возможность отключить контроль DataSet-а за ключевым полем???
Автор: volser
Дата сообщения: 20.02.2010 23:49
zakov
Я так и не получил ответ чем же это плохо? Зачем это делать если дырки в последовательности айдишек и так будут? Или же можно отказаться от инкрементов и писать свой велосипед.
Автор: zakov
Дата сообщения: 21.02.2010 00:23

Цитата:
Я так и не получил ответ чем же это плохо? Зачем это делать если дырки в последовательности айдишек и так будут? Или же можно отказаться от инкрементов и писать свой велосипед.


Рассмотрим такую ситуёвину...
Надо будет например работать не в онлайн режиме (без постоянной связи с сервером), откуда тогда брать айдишки???
Автор: volser
Дата сообщения: 21.02.2010 13:20
zakov
Айди это суррогатный локальный ключ уникальный в пределах одной базы данных. На него не должна завязываться никакая логика, он должен обеспечивать только целостность базы данных. Если нужно реплицировать данные между двумя базами, то нужно ввести еще один ключ GUID, который является глобальным уникальным ключом.
Автор: V1s1ter
Дата сообщения: 21.02.2010 14:43
zakov
В дополнение к сказаному volser.
Если при установке программы на клиенскую машину можно задать ей уникальный номер, то етот номер можно использовать как часть составного ключа.
Пример, у Вас 50 рабочих мест в разных частях страны на которых формируются заказы, тогда ключ заказа имеет вид <Номер рабочего места><Номер заказа>.
Где в поле <Номер рабочего места> числа от 1 до 50, а в <Номер заказа> от 1 до ..., причем для каждого рабочего места нумерация поля <Номер заказа> начинается с 1.
Такой подход прекрасно работает в оффлайне и прекрасно собираются заказы с рабочих мест вообще не подключенных к инету.
Автор: zakov
Дата сообщения: 21.02.2010 15:14
volser
V1s1ter

спасибо

только я так и не понял, при работе offline откуда айдишки брать, генератор-то не вызовешь уже?..
Автор: V1s1ter
Дата сообщения: 21.02.2010 15:18
zakov
Если решение типа <Номер рабочего места><Номер заказа> подходит, то генератор для <Номер заказа> локальный, то есть у каждого рабочего места свой.
Автор: volser
Дата сообщения: 21.02.2010 22:55
zakov
Что такое офлайн режим? Какая база используется для этого режима?
Автор: KurkSS
Дата сообщения: 25.02.2010 12:14
Помогите с внешним видом при открытии проекта.
Я открываю dpr файл и вместо привычныго автооткрытия модулей проекта вижу сам главный файл проекта.....

Тоесть если бы я снуля сам делал весь проект всё было бы ок.
Но в данном случае я перенёс проект с другого компа и подключил ещо модуль данных,
который уже сделан был другим человеком.....
гуглить не получилось... понимаю что ума не зватило правильно поставить вопрос гуглу...

Вопрос: как и где настроить, какие файлы должны окрываться в окне кода при открытии dpr файла???

Добавлено:



Цитата:
Вопрос: как и где настроить, какие файлы должны окрываться в окне кода при открытии dpr файла???


Магия поста.... сформулировал вопрос, сразу додумался где стоит методом тыко поискать.....
Может куму надо и тоже трудно найти будет:

В меню Настройки(Tools) в настройках окружения в preferences есть настройки автосэйва
ТАм их две штуки
Дэсктоп проэкта
редактируемые файлы

второе сохраняет какие файлы должны быть открыты в окне редактора кода
первое - тоже что и сохраниние десктопа в панели самой делфи.... только сдесь сохранение идёт применительно к проекту.
Автор: VadimLou
Дата сообщения: 25.02.2010 21:17
volser

Цитата:
Что такое офлайн режим?

Отсутствует связь с основной БД.

Цитата:
Какая база используется для этого режима?

RAM
Автор: volser
Дата сообщения: 26.02.2010 10:56
VadimLou
И зачем отвечать на вопрос который адресован не вам?
Автор: ceres578
Дата сообщения: 27.02.2010 09:04
Здравствуйте! Не нашел в какую тему написать, но думаю что в эту. Есть задача: написать ActiveX-элемент, который при открытии формы на котором он находится, делал дочерним определенное, заранее открытое окно. Прошу строго не судить - я в Дельфи начинающий. Делаю так: создал ActiveX Form, в событии OnCreate написал:

procedure TActiveFormX.ActiveFormCreate(Sender: TObject);
var
hwnd: dword;
begin
hwnd:=FindWindow(nil, 'Блокнот');
Windows.SetParent(hwnd, Handle);
end;

Окно 'Блокнот' из панели задач пропадает, т.е. как я понимаю ActiveX форма делает захват, но на ней ничего не отображается. Подскажите, что сделать.. Заранее спасибо!
Автор: Frodo_Torbins
Дата сообщения: 27.02.2010 15:24
ceres578
Отображается, просто форма должна быть размером с экран. Блокнот на ней ведь в тех же координатах располагается, что и на десктопе.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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