Войти

Показать полную графическую версию : Delphi .: [все вопросы] :.


Страниц : 1 [2] 3 4 5

Serega
21-02-2009, 22:55
Здравствуйте, как добавить в ListView данные, т.е. в первую колонку данные из Edit, во вторую данные в зависимости от выбора в ComboBox?

Вопрос решён!


procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Items.Add.Caption:=Edit1.Text;
ListView1.Items[ListView1.Items.Count-1].SubItems.Add(ComboBox1.Text);
end;

shynar
22-02-2009, 15:10
Здравствуйте DillerInc, понимаю в чужом коде разбираться трудно. Но не могу понять своих ошибок, если не затруднить хотя бы наведите на какую-нибудь мысль:
function shifr(N1, N2:string): String;
var
KZU: string[32];
Temp: string[4];
R:string;
i:integer;
table: array [0..7] of integer;
begin
asm
xor esi, esi
mov ecx, 24
@cycle1: push ecx
………………………………..
mov ecx, 4
mov ebx, 3
clc
@SM1: mov al, byte ptr KZU[esi+ebx] // Ошибка: Invalid register combination
adc byte ptr Temp[ebx], al
dec ebx
loop @SM1
end;

table:=KBlock(Temp); // Ошибка: Incompatible types: 'Array' and 'Integer'
R:=ShiftR11(Temp);
……………………………………
asm
add esi, 4
pop ecx
loop @cycle1
end;
end;
---------------------------------------------------------
function KBlock(Temp:string): array[0..7] of Integer; // Ошибка: Identifier expected but 'ARRAY' found
var
str, stb:array[1..8] of integer;
i:integer;
begin
asm
mov ecx, 4
xor esi, esi
xor ebx, ebx
@cycle1: mov al, byte ptr Temp[ebx]
and al, 00001111 //Ошибка: Operand size mismatch
mov byte ptr str[esi], al
mov byte ptr stb[esi], esi // Ошибка: Operand size mismatch
inc esi
mov al, byte ptr Temp[ebx]
and al, 11110000 // Ошибка: Operand size mismatch
mov byte ptr str[esi], al
mov byte ptr stb[esi], esi // Ошибка: Operand size mismatch
inc esi
inc ebx
loop @cycle1
end;
for i:=0 to 7 do
result:=StrToInt(ShifrZamForm2.StringGrid1.Cells[str[i], stb[i]]); [I]// Ошибка: Array type required

end;

shynar
23-02-2009, 11:34
Здравствуйте! Да некоторые ошибки оказались вообще детскими, выспалась, уже некоторые исправила, но как быть в этом случае, где есть ошибки, заменить на просто bx не идёт, пожалуйста подскажите:

function shifr(N1, N2:string): String;
...
begin
asm
mov ecx, 4
mov ebx, 3
clc
@SM1: mov al, byte ptr KZU[esi+ebx] // Ошибка
adc byte ptr Temp[ebx], al
dec ebx
loop @SM1
...
end;
...
call KBlock
...
end;

procedure KBlock;
asm
...
xor esi, esi
...
mov byte ptr stb[esi], esi // Ошибка
...
end;

DillerInc
23-02-2009, 11:54
shynar, значит так:

mov al, byte ptr KZU[esi+ebx]
...подобная связка не поддерживается ассемблером Intel x86 при вычислении эффективного адреса.Вам нужно читать какой-то мануал,раз вы уже так взялись за это дело,а не пытаться что-то вслепую тыкать:

Intel x86 has the following format to manage the calculation of the effective address of an array member.

[ Base Address + Index * Scale + Displacement ]

[ebx + ecx * 4 + 8]

ebx is the base address.
ecx is the index.
4 is the scale based on the data size.
8 is the displacement in BYTES.

Base Address
The register that has the starting address of the array in memory.

Index
The register used to determine the offset from the base address.

Scale
The data size based multiplier for the index.

Displacement
The additional offset adjustment from the base address.


И я надеюсь,что вы уяснили себе,что функция не может возвращать непосредственно массив.Она может вернуть указатель на него.В регистре eax.И это уже не зависит от того,на чём вы пишите: Delphi, C, ASM, etc...

shynar
26-02-2009, 10:24
Здравствуйте! как будет выглядет объявление переменной (ассемблерная) в делфи?
K8K7 db 1DH, 1BH, 14H, 11H, и т.д до 256 байт
К6К5 db FDh, FBH, F4H,... и т.д. до 256 байт
К4К3 db DDh, DBH, D4H,... и т.д. до 256 байт
Ещё, переменная N1 в делфи описана в Private, но процедура вызванная из ассемблерной вставки её не видит, придётся описать как локальную , но от этого меняется смысл проги, хотелось бы сделать красивую, локаничную. Так как надо сделать, чтобы эта прцедура увидела переменную из Private?
private
N1: string;
.....
asm
...
call процедура
...
end;

ALI
26-02-2009, 15:09
Так а мне кто-нибудь все же поможет или нет? :) Я чуть раньше спрашивал.

skinail
28-02-2009, 18:12
как можно считать частоту с (входа)микрофона и вывести в Edit ili Label

dmitryst
28-02-2009, 18:45
skinail, насколько я помню из университетского курса, быстрым преобразованием Фурье :). Точнее, так получается спектр сигнала, а если этот сигнал "монохромный" (одна частота) - получим прямо эту частоту.
ссылочка (http://psi-logic.narod.ru/fft/fft.htm) на пример реализации

Serega
13-03-2009, 17:20
Здравствуйте, добавил в раздел Полезные инструменты, ссылку на удобный редактор кода от CnPack, для языков Delphi и C++.

ALI
16-03-2009, 15:35
Подскажите, как можно рисовать на канве BitBtn, а то у меня ничего не получается. Дельфи не реагирует на команды вида:
ImageList1.Draw(BitBtn1.Glyph.Canvas, 0, 0, 0);
BitBtn1.Glyph.Canvas.LineTo(5, 5);

Alan85
16-03-2009, 20:21
попробуй как то вот так:

procedure TForm1.Button1Click(Sender: TObject);
var can:tcanvas;
begin
can:=TCanvas.Create;
can.Handle:=GetDC(BitBtn1.Handle);
can.LineTo(10,100);
can.free;
end;

ALI
17-03-2009, 16:18
Alan85, просвети неуча, а что за функция GetDC и что за свойство Handle?
И еще: все нормально, все рисуется, как надо, но есть одна маленькая загвоздка: после того, как я перевожу фокус на какой-нибудь другой компонент, нарисованное на канве исчезает. Что делать, как сохранить рисунок?

Alan85
17-03-2009, 18:33
функция GetDC из WinAPI - дает чтото вроде номера холста (DC) на чем будем рисовать , при этом для его определения надо задать номер объекта на котором будем рисовать (Handle). Этот номер (дескриптер) есть у каждого объетка в Windows. И выходит что мы делаем холст
can:=TCanvas.Create; »
затем задаем ему что он холст объекта кнопки:
can.Handle:=GetDC(BitBtn1.Handle); »
и дальше рисуем что хотим ну и после этого не забываем его удалить из памяти
кстати - can.Handle »
на мой взгляд некорректно с точки зрения реализации так как Handle здесь используется в не том смысле что в большинстве случаев

R.M.L
18-03-2009, 05:27
Срочно нужна ваша помощь!
Как на Дельфи запуская файл с уникальной папки (то есть где сидит сама программа .exe) распознать букву диска?
Я делаю для себя что то типа Авторана,и определить букву диска не могу.Свою могу а если поставить на другую машину то выходит ошибка.
Можно посоветовать всякие там Авторановские проги (Autoplay media,MMB,Neobook и тд) но эти проги лишены многими компонентами.Мне нужен компонент ScrollBox для прокручивания,т.к я делаю окно 400 на 300,а файлы на этом окне будет много.
Но функция ShellExecute,winexec ищет только по конкретному пути и определению,а мои файлы не будут загружаться на HDD я их прямо с диска хочу проинсталлирвоать или просто открыть какой то файл.

Serega
18-03-2009, 07:48
R.M.L, ExtractFilePath(Application.ExeName) - получите путь, откуда запущена программа, а ExtractFileDrive(Application.ExeName) - получите имя диска...

ALI
18-03-2009, 15:21
Возникла проблема с DBGrid'ом, а точнее с хинтами к нему. При наведении на определенный элемент в DBGrid (например, на EE) появляется хинт, при смещении указателя он исчезает, как ему и положено и как заложено в код программы. Но! При перемещение ентого указателя в сторону нижнего правого угла, вверху появляется странное мерцание, как будто хинт исчезает и снова появляется.

Код обработчика перемещения мыши:
procedure TMainForm.MDBGridMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer); // Обработка перемещения курсора мыши над MDBGrid
var XX, YY, CurRec: integer;
procedure HideHint;
begin
Application.HideHint;
Exit;
end;
begin
XX := MDBGrid.MouseCoord(x,y).x;
YY := MDBGrid.MouseCoord(x,y).y;
Label1.Caption := IntToStr(XX) + ', ' + IntToStr(YY);
with THackDBGrid(MDBGrid) do
begin
if ((XX <> MDBGrid.Columns.Count - 2) or (YY <> 0)) and
((XX <> 3) or (YY <> N2 + 1)) then
HideHint;
CurRec := DataLink.ActiveRecord;
DataLink.ActiveRecord := YY - 1;
if (XX = MDBGrid.Columns.Count - 2) and (YY = 0) then
MDBGrid.Hint := 'Cоциометрический' + #13 + ' статус';
if (XX = 3) and (YY = N2 + 1) then
MDBGrid.Hint := 'Эмоциональная' + #13 + 'экспансивность';
Application.ActivateHint(Point(X,Y));
DataLink.ActiveRecord := CurRec;
end;
end;

Выглядит таблица и мерцание следующим образом:
http://fo-ma.ru/8/73/59/387359/5.jpg

ALI
18-03-2009, 15:43
Проблему решил буквально через 5 минут после того, как написал сообщение, следующим образом:
procedure TMainForm.MDBGridMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer); // Обработка перемещения курсора мыши над MDBGrid
var XX, YY, CurRec: integer;
procedure HideHint;
begin
MDBGrid.ShowHint := False;
Exit;
end;
begin
XX := MDBGrid.MouseCoord(x,y).x;
YY := MDBGrid.MouseCoord(x,y).y;
Label1.Caption := IntToStr(XX) + ', ' + IntToStr(YY);
with THackDBGrid(MDBGrid) do
begin
if ((XX <> MDBGrid.Columns.Count - 2) or (YY <> 0)) and
((XX <> 3) or (YY <> N2 + 1)) then
HideHint;
CurRec := DataLink.ActiveRecord;
DataLink.ActiveRecord := YY - 1;
if (XX = MDBGrid.Columns.Count - 2) and (YY = 0) then
begin
MDBGrid.ShowHint := True;
MDBGrid.Hint := 'Cоциометрический' + #13 + ' статус';
end;
if (XX = 3) and (YY = N2 + 1) then
begin
MDBGrid.ShowHint := True;
MDBGrid.Hint := 'Эмоциональная' + #13 + 'экспансивность';
end;
Application.ActivateHint(Point(X,Y));
DataLink.ActiveRecord := CurRec;
end;
end;

:)

ALI
18-03-2009, 17:49
Тогда вопрос таков: а можно ли напрямую загружать в Глиф рисунок из Имажлиста, не занимаясь отрисовкой на канве БитБтн?

Alan85
18-03-2009, 19:01
ImageList1.GetBitmap(1,BitBtn1.Glyph); // 1 - Это индекс изображения в imagelist

R.M.L
20-03-2009, 00:04
Serega,спасибо большое,а готовую функцию можно у вас взять? У меня что-то никак не получается,божее




© OSzone.net 2001-2012