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

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

Автор: Erazer
Дата сообщения: 04.09.2006 16:48
никто не встречал примера простого encoder'а работающего с mp3 на входе и выдающего его же только с другими параметрами ?

Добавлено:
Arvur
хрен их знает где они, для меня главное что вместо пустой страницы начали показываться надавние проэкты, и то приятно....
Я воопче не могу понять кто и с каких делов ее в прынципе сваял, и почему багленд не может сам сделать че нить подобное и добавить наконец в свои апдейты и хотфиксы...
Автор: Arvur
Дата сообщения: 04.09.2006 17:13
Erazer
Грабли нашлись, ответ здесь. Обсуждение плавно переползает туда
Про эту багу (и еще одну) я автору написал. Кто сваял можно прочитать в пункте readme
Автор: George_Lucky
Дата сообщения: 05.09.2006 07:32
Может кто подскажет, возможно ли и как это сделать - привязать прогу к конкретному компьютеру, с целью недопущения ее копирования на другой?
типа, скопировал на другой, а прога не запускаца...
спасибо.
Автор: nuker2015
Дата сообщения: 05.09.2006 08:37
George_Lucky
К номеру винчестера, Сетевухе, Биос, Процессор.
Есть куча подобных компонентов, сейчас точно не вспомню.
Сам решай к каким параметрам прицепляться, к винту я лично не рекомендую, т.к может достаточно часто меняться.
Google и SourceForge помогут.
Автор: SERGE_BLIZNUK
Дата сообщения: 05.09.2006 09:46
YFred

Цитата:
Есть подозрение, что это зависит от класса DataSet'а.

ну так попробуйте...
1)
AdsQuery1.IndexFieldNames := 'имя_невычисляемого_поля';
AdsQuery1.First;
убедились, что работает. Если работает, тогда
2)
AdsQuery1.IndexFieldNames := 'Мое_выч_поле';
AdsQuery1.First;

чего спрашивать, если вы ещё не проверили, работает предложенный вам вариант или нет.
Вот если не работает - напишите об этом и кто-нибудь, поопытнее и помудрее, чем я, обезательно вам поможет.
Автор: Narrator
Дата сообщения: 05.09.2006 16:00
У меня обнаружилась ошибка в поведении окон (а может не только у меня - прошу проверить). В тестовом приложении две формы - основная и создаваемая в рантайме. Ошибка в том, что не закрывается дочернее окно после минимизации и востановления приложения ни програмно, ни крестиком, ни по Alt+F4. Проверил в BDS2006 и D7. Код тестового приложения далее
[more]

Код:
unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
I:Integer;
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
I:=5;
Timer1.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Hide;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form2:= TForm2.Create(Self);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if I>0 then begin
if not Form2.Visible then Form2.Visible :=True;
Dec(I);
end else begin
Timer1.Enabled := False;
Form2.Hide;
end;
end;

end.
Автор: RomanTim
Дата сообщения: 05.09.2006 20:46
Narrator
Косяк вполне в духе VCL - не доделанная обработка сообщений в не самых распространенных вариантах поведения. Причем ошибки сразу 2:
1. Не закрывающееся окно - в методе Hide свойству Visible присваивается False, а само свойство в свою очередь проверяет - если новое значение равно текущему, то ничего не делать. TForm при обработке сообщения SW_SHOWWINDOW (которое и вызывается при разворачивании приложения из трея) не меняет значение Visible - в результате после твоего Hide Visible зависает в False.
2. Появление окна после Hide - при разворачивании приложения тот же обработчик SW_SHOWWINDOW опираясь на поле FShowAction вызывает на себя ShowWindow, а запоминает при сворачивании, свойство Visible же при скрывании окна это поле в saIgnore не сбрасывает.

Может помочь такая доработка TForm2 (хотя не факт что где нибудь в другом месте это не аукнется - слишком уж все завязано одно на другое): [more]type
TForm2 = class(TForm)
procedure FormHide(Sender: TObject);
private
FShowAction: TShowAction;
procedure WM_ShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
....

procedure TForm2.FormHide(Sender: TObject);
begin
FShowAction := saIgnore;
end;

procedure TForm2.WM_ShowWindow(var Message: TWMShowWindow);
const
ShowCommands: array[saRestore..saMaximize] of Integer =
(SW_SHOWNOACTIVATE, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED);
begin
with Message do
case Status of
SW_PARENTCLOSING:
begin
if IsIconic(Handle) then
FShowAction := saMinimize
else if IsZoomed(Handle) then
FShowAction := saMaximize
else
FShowAction := saRestore;
inherited;
end;
SW_PARENTOPENING:
if FShowAction <> saIgnore then
begin
ShowWindow(Handle, ShowCommands[FShowAction]);
FShowAction := saIgnore;
end;
else
inherited;
PBoolean(@Visible)^ := Message.Show;
end;
end;
[/more]
Автор: afiget
Дата сообщения: 05.09.2006 21:09
Narrator
Сделай
Form2.Free;
когда останавливаешь таймер. Само собой, этот способ подойдет только если тебе не нужна эта форма после отработки таймера.


Добавлено:
RomanTim
Какой же это косяк VCL?
форма 2 в свернутом положении приложения имеет свойство визибл, равное false. Т.е. она уже невидима.

Narrator
2-й способ.
Обработать событие OnRestore для приложения и в нем "спрятать" форму 2.
Автор: andead
Дата сообщения: 05.09.2006 23:32
как отловить момент когда окно переходит из полноэкранного режима в обычный
Автор: nuker2015
Дата сообщения: 06.09.2006 04:46
andead
дак события: onCanResize , onResize , onActivate
Автор: RomanTim
Дата сообщения: 06.09.2006 06:58
afiget
По твоему так и должно быть? Попробуй по таймеру выводить в заголовок второй формы ее Visible и поуправлять ею через ShowWindow - очень интересно смотреть на форме что ее Visible оказывает False. То же происходит и при разворачивании - форма на экране, а VCL считает что ее тут нет.
А Visible = False у свернутой формы становится не когда она свернулась, а когда у нее основная форма вызвала Hide.

andead
nuker2015

Цитата:
дак события: onCanResize , onResize , onActivate

Последнее если фокус с формы не уходил вообще не вызывается, а в первых двух WindowState возвращает то значение, из которого происходит изменение, да и вызываются при любом изменении размеров.
Смотри WM_SYSCOMMAND - там явно говорится - minimize, maximize или restore
Автор: Narrator
Дата сообщения: 06.09.2006 12:30
afiget
Form2.Free - действует конечно, но слишком репрессивно... Будем убеждать...

Прав RomanTim. Корень ошибки в том, что не сбрасывается FShowAction в SetVisible формы, что в дальнейшем приводит к отображению окно (через обработчик WM_SHOWWINDOW), которое не должно быть видно. Решил перекрытием Visible, Hide и копированием WM_ShowWindow. Почти как у RomanTim...
[more]

Код:
type
TForm2 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
FShowAction: TShowAction;
procedure SetVisible(Value: Boolean);
procedure WM_ShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
public
{ Public declarations }
procedure Hide;
property Visible write SetVisible default False;
end;

var
Form2: TForm2;

implementation

{$R *.dfm}
procedure TForm2.SetVisible(Value: Boolean);
begin
FShowAction := saIgnore;
inherited Visible := Value;
end;

procedure TForm2.Hide;
begin
Visible:= False;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
if Visible then
Caption:= 'Visible = True'
else
Caption:= 'Visible = False';
end;

procedure TForm2.WM_ShowWindow(var Message: TWMShowWindow);
const
ShowCommands: array[saRestore..saMaximize] of Integer =
(SW_SHOWNOACTIVATE, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED);
begin
with Message do
case Status of
SW_PARENTCLOSING:
begin
if IsIconic(Handle) then
FShowAction := saMinimize
else if IsZoomed(Handle) then
FShowAction := saMaximize
else
FShowAction := saRestore;
inherited;
end;
SW_PARENTOPENING:
if FShowAction <> saIgnore then
begin
ShowWindow(Handle, ShowCommands[FShowAction]);
FShowAction := saIgnore;
end;
else
inherited;
end;
end;

Автор: afiget
Дата сообщения: 06.09.2006 13:01
RomanTim
По моему должно быть так, как это описано в документации и реализовано в классе. И ожидать чего-либо другого не стоит :)
Автор: Erazer
Дата сообщения: 06.09.2006 15:03
Arvur
бум иметь ввиду пасибки.
Автор: RomanTim
Дата сообщения: 06.09.2006 16:20
afiget
В документации я что-то не видел описания таких тонкостей поведения окон, а на счет правильно то что написано... так вроде программистов борланда пока не канонизировали и ошибаются они как и все остальные люди
Автор: andead
Дата сообщения: 07.09.2006 00:44
где можно достать все апдейты для 6-ой Delphi?
Автор: Arvur
Дата сообщения: 07.09.2006 01:10
andead
_http://bdn1.borland.com/cgi-bin/surveys/thanx.cgi?del6reg_updates_down
Кажись оно.
Автор: andead
Дата сообщения: 07.09.2006 01:39
Arvur
там просят логин и пароль((
забыл добавить что нужно для Enterprice версии, если это имеет значение

Добавлено:
вот нашёл кажись, может ещё кому понадобится
_ftp://ftpd.borland.com/12347/devsupport/delphi/d6/D6_upd2_ent.exe
33,2mb
Автор: Erazer
Дата сообщения: 07.09.2006 16:11
Посмотрите плз правильно ли я перевел с С++ вот этот фрагментик ?

_declspec(dllexport) _stdcall void Stereo2Mono(short *instereo, short *outmono, int bytes)
{
int a;
for (a=0; a<bytes/4; a++)
outmono[a]=(instereo[a*2]+instereo[a*2+1])/2; // mono=(left+right)/2
}

Кажись * тут (*instereo) значит указатель, но я не пойму как это перевести правильно

procedure Stereo2Mono(instereo: PSmallInt; outmono: PSmallInt; bytes: integer);
var
a: integer;
begin
for a:=0 to (bytes div 4)
do
outmono[a]:= (instereo[a*2]+instereo[a*2+1]) div 2;
end;

В любом случае делфя выдает "[Pascal Error] : E2016 Array type required ?" я то ее понимаю,
но как правильно оформить не знаю...
Автор: KRS545
Дата сообщения: 07.09.2006 17:51
В сях instereo и outmono похоже динамические массивы, а bytes их размер.
type
arr = array of byte;
procedure ToDo(a:arr);

var
qq:arr;

потом где-то должно быть SetLength(qq,bytes)
ну и вызываем процедуру

ToDo(qq);
Автор: RomanTim
Дата сообщения: 07.09.2006 17:51
Правильнее так, одно непонятно - почему "div 4", по идее размер первого массива в 2 раза больше второго и тогда если bytes - размер первого, то должно быть "div 2"
[more]
type
ByteArray = array [0..0] of Byte;
PByteArray = ^ByteArray;

procedure Stereo2Mono(instereo, outmono: PByteArray; bytes: Integer); stdcall;
var
a: Integer;
begin
for a := 0 to bytes div 4 do
outmono[a] := (instereo[a * 2] + instereo[a * 2 + 1]) div 2;
end;[/more]
Автор: KRS545
Дата сообщения: 07.09.2006 18:04
А по моему не обязательно указатель делать-
PByteArray = ^ByteArray - лишний гемморой
ByteArray в данном случае и так указатель...


Добавлено:
А ссори не заметил [0..0].
А зачем так?
Автор: RomanTim
Дата сообщения: 07.09.2006 19:26
KRS545

Цитата:
А зачем так?

Можно и MaxInt-1 написать, но так короче
В принципе можно и через динамический массив сделать, но мне не нравится их передавать в параметрах... да и такая конструкция по идее больше соответствует C-шному массиву-указателю
Автор: FireZone
Дата сообщения: 08.09.2006 04:58
Erazer

Цитата:
_declspec(dllexport) _stdcall void Stereo2Mono(short *instereo, short *outmono, int bytes)
{
int a;
for (a=0; a<bytes/4; a++)
outmono[a]=(instereo[a*2]+instereo[a*2+1])/2; // mono=(left+right)/2
}
вот аналог в делфях (только нужно добавить эту функцию в Exports):[more]
Код: procedure Stereo2Mono(instereo: PSmallInt; outmono: PSmallInt; bytes: integer); stdcall;
var a: integer;
begin
for a:=0 to (bytes div 4) - 1 do // Внимательнее с границами!
PSmallInt(Integer(outmono) + a * sizeof(SmallInt))^ := ( PSmallInt(Integer(instereo) + a*2*sizeof(SmallInt))^
+ PSmallInt(Integer(instereo) + a*2*sizeof(SmallInt)+1)^ ) div 2
end;
Автор: pit23
Дата сообщения: 08.09.2006 10:18
Здарова.

Вопрос: Как определить количество найденных записей после фильтрации таблицы (ADOTable) в делфи 6. При использовании свойства RecordCount выводит количество всех записей в таблице.
Автор: abv
Дата сообщения: 08.09.2006 10:48

Цитата:
Вопрос: Как определить количество найденных записей после фильтрации таблицы (ADOTable) в делфи 6. При использовании свойства RecordCount выводит количество всех записей в таблице.

Никак. Если сильно надо, пробежись по всем записям и подсчитай, второй вариант - используй Adoquery и запрос типа
select count(*) from MyTable where ... (фильтр на таблицу)
Автор: pit23
Дата сообщения: 08.09.2006 11:15
abv

Спасибо. В принципе после того как я послал сообщение мне самому это пришло в голову.
Автор: Erazer
Дата сообщения: 08.09.2006 14:28
Спасибо всем кто принял участие в моей проблеме, буду пытаться реализовать Ваши советы на практике. Единственное что могу добавить - код 100% работающий и опубликован автором, поэтому если что-то не понятно все равно оно функциклирует при чем правильно как это ни странно.
Автор: xitsmex
Дата сообщения: 09.09.2006 10:21
hi2all!
Нет ли у кого готового wrapper`a для четния и _записи_ VERSIONIFO в файл? Именно записи. GetVersionInfo здесь не пройдет. Задача - менять версию нескольких файлов после компиляции.
Автор: Arvur
Дата сообщения: 09.09.2006 12:49
По поводу интеграции Delphi и Subversions
Кроме Delphi TortoiseSVN AddOn нашлось еще кое-что здесь.
Оттуда же ссылка на Subversion plugin for BDS 2006

Добавлено:
xitsmex
Есть пример эксперта - после компиляции пишет в PE Header время компиляции.
С VerInfo в закромах ничего не нашлось..

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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