Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 331
от 21.12.2005, 19:36

Администратор:Калашников О.А.
В рассылке:Подписчиков: 240, Экспертов: 49
В номере:Вопросов: 8, Ответов: 27


Вопрос № 31572: Здраствуйте уважаемые эксперты. у меня такая проблема, на форме есть 2 листбокса, в одном находятся адреса файлов, например C: estabc.txt мне нужно чтобу програма скопировала содержимое listbox1 в listbox2 и чтобу в listbox2 появилось только на...
Вопрос № 31574: Здраствуйте Эксперты у меня непонятки вот с таким выражением - "Статическими массивами называются те, константы которых задают нижнию и верхнию часть диапазона" Обьясните пожайлуста на примере какие именно константы задаю...
Вопрос № 31575: Здраствуйте Эксперты у меня есть вопрос - обьясните пожайлуста на примере вот такое выражение: "Динамические массивы. Если новое число элементов больше старого, то новые элементы добовляются в конец массива, а их значения исходно будут неопредел...
Вопрос № 31594: Уважаемые эксперты! Пытаюсь присвоить Image1.Canvas.Font.Size:=4. Размер не уменьшается - всегда равен 8. В большую сторону увеличивается. Подскажите в чём причина....
Вопрос № 31604: Здравствуйте.Возник вопрос.Подскажите пожалуйста.В DBGrid вывожу данные из Oracle (две колонки). У DBGrid установил свойство dgRowselect:=true. Как сделать,чтобы при выделении строки Event: onCellClick в один Edit выводилось значение одной колонки,а ...
Вопрос № 31613: Здравствуйте! Не подскажите ли, как сделать так, чтобы длинный текст в ячейке StringGridа или ListView в Delphi7 выводился в несколько строк.Заранее спасибо....
Вопрос № 31621: Здравствуйте эксперты ! А как проиграть DVD-файлы (ну, там vob, ifo и т.д. всякие)...
Вопрос № 31626: Господа эксперты, приветствую всех, подскажите плз. C++Builder 6 есть небольшое приложение, работающее с базой данных под FireBird 1.5.2 + IBX во время выполнения работает все чудесно, все функционирует и выполняется, прям любо-дорого раб...

Вопрос № 31.572
Здраствуйте уважаемые эксперты.
у меня такая проблема, на форме есть 2 листбокса, в одном находятся адреса файлов, например C: estabc.txt мне нужно чтобу програма скопировала содержимое listbox1 в listbox2 и чтобу в listbox2 появилось только название файла, в данном примере abc.txt
Помогите пожалуйста.
Заранее спасибо.
Отправлен: 15.12.2005, 21:27
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Romodos
Здравствуйте, Станислав!
Ну, я думаю надо юзать функцию Extractfilepath(s:tring):string;
Пример в приложении. Думаю, всё понятно

Приложение:

---------
FAQ me off!

Ответ отправил: Romodos (статус: Студент)
Отправлен: 15.12.2005, 21:41
Оценка за ответ: 5

Отвечает: Golden Spider
Здравствуйте, Станислав!

Отвечу на вторую половину вашего вопроса.
Cуществует функция ExtractFileName(FilePath:string):string она возвращает имя файла по полному(абсолютному) пути (ещё есть ExtractFilePath(FilePath:string):string то же самое только не имя файла, а путь до его папки).

Надеюсь скопировать с использованием этих функций вы сможете сами :).

---------
Семь раз проверь, один раз откомпилируй!
Ответ отправил: Golden Spider (статус: 4-ый класс)
Отправлен: 15.12.2005, 22:20

Отвечает: sir henry
Здравствуйте, Станислав!
Это можно сделать так:
For i:=0 To ListBox1.Count-1 Do
ListBox2.Items.Add(ExtractFileName(ListBox1.Items[i]));
Ответ отправил: sir henry (статус: Академик)
Отправлен: 16.12.2005, 05:27
Оценка за ответ: 5

Отвечает: Schmak
Здравствуйте, Станислав!
Используйте функцию ExtractFilename(FileName:string), она возвращает имя файла из полного имени с путём.
1)Очищаем 2-ой список ListBox2.Clear;
2)Для каждого элемента первого списка (нумерация с 0) выполняем эту функцию.
for i:=0 to ListBox1.Items.count-1 do
ListBox2.Items.Add(ExtractFileName(listbox1.Items[i]));
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 16.12.2005, 05:33

Отвечает: Ерёмин Андрей
Здравствуйте, Станислав!
Вот вам код для такого копирования:
Var I: Integer;
...
For I:=0 To ListBox1.Items.Count-1 Do
ListBox2.Items.Add(ExtractFileName(ListBox1.Items[I]));

---------
В то время как остальные процессоры уже закончили работу, процессоры VIA продолжают работать, работать и работать! :))
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 16.12.2005, 08:03
Оценка за ответ: 5


Вопрос № 31.574
Здраствуйте Эксперты у меня непонятки вот с таким выражением -

"Статическими массивами называются те, константы которых задают нижнию и верхнию часть диапазона"

Обьясните пожайлуста на примере какие именно константы задают части диапазона?
Отправлен: 15.12.2005, 22:15
Вопрос задал: Gi-Woox.org (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Gi-Woox.org!
к примеру

ar: array (0..10) of integer;

жестко описаны границы.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 15.12.2005, 22:23
Оценка за ответ: 4

Отвечает: Golden Spider
Здравствуйте, Gi-Woox.org!

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

Например:
var
mass:array [1..100] of integer;

В данном массиве 100 элементов начиная с 1 и заканчивая 100.

можно начинать не с 1:
a:array [45..3424] of byte;
и др.

Есть ещё динамические массива кол-во их элементов может менятся.

Надеюсь я прояснил ситуацию :).

---------
Семь раз проверь, один раз откомпилируй!
Ответ отправил: Golden Spider (статус: 4-ый класс)
Отправлен: 15.12.2005, 22:27

Отвечает: Tsechoev Bagaudin
Здравствуйте, Gi-Woox.org!
В Делфи:
MyArray: array[0..10] of integer;
0..10 - это и есть константы границ диапазона, в данном случае получается массив из 11 элементов.
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: Студент)
Отправлен: 15.12.2005, 23:34

Отвечает: Denisss
Здравствуйте, Gi-Woox.org!
Кто это такое написал?
Статический массив - тот массив, длину которого вы заранее указали и не можете ее изменить.
Пример:
  Mass: array[0..123] of byte;
- массив байтов, длиной в 124, здесь:
Mass - название массива
array - определяет тип переменной Mass (т.е. array=массив, в переводе с ангийского)
0 - нижняя часть диапазона, является константой. Можно задавать и более, чем 0
123 - верхняя часть диапазона, также является константой. Обязательно должна быть не меньше (т.е. больше, либо равно) нижней части. Если равна нижней части, то длина массива = 1.
Диапазон указывается в квадратных скобках [], между нижней и верхней границами ставятся две точки [N..V]
of byte - указывает на то, из чего состоит массив. Т.е., в данном случае, массив состоит из байтов. Если хотите указать, что массив состоит из целых чисел, то надо указать так: of Integer. И т.д.
Длина массива = (верхняя граница - нижняя граница + 1).
Ответ отправил: Denisss (статус: Специалист)
Отправлен: 15.12.2005, 23:37

Отвечает: Schmak
Здравствуйте, Gi-Woox.org!
Как задаётся статический (обычный) массив
var a:array [1..10] of integer;
b:array [1..10,2..5] of string;
1)Ещё запуска программы мы определяем размер массива. Во время работы программы мы не сможем изменять его влюбом случае. Т.е если на потребуется ввести меньше 10 (максимальное в 1-ом примере) элементов то оставшиеся элементы будут просто не заполнены. Если же потребуется ввести больше максимального значения то мы это просто не сможем сделать.
2)Нижняя часть диапозона в даном примере 1, верхняя - 10. Т.е массив состоит из 10 элементов с номерами 1..10
Задавать можно не только линейные массивы, но многомерные. При этом каждое измерение задаётся своими константами. Т.е во 2-ом примере массив представляет собой матрицу 10(1..10)*4(2..5).
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 16.12.2005, 05:30

Отвечает: sir henry
Здравствуйте, Gi-Woox.org!
Коряво написано. Если сказать по русски, то в статическом массиве заданы верхний и нижний индекс при его объявлении в разделе переменных. У динамического массива индексы не задаются, они определяются и присваиваются в процессе работы программы.
Var
StaticArray: array[0..55] of integer; {Статический массив с заданными верхним и нижним индексами}
DinamicArray: array of integer; {Динамический массив. В нем индексы не заданы}
Ответ отправил: sir henry (статус: Академик)
Отправлен: 16.12.2005, 05:32

Отвечает: Ерёмин Андрей
Здравствуйте, Gi-Woox.org!
Здесь имеется ввиду то, что статические массивы имеют предопределённое число элементов и расширить/сжать массив уже нельзя. Соответственно, динамические массивы позволяют изменять количество элементов во время выполнения программы.
Var ABC: Array[1..5] Of Integer;
1 и 5 - константы, задающие диапазон.
---------
В то время как остальные процессоры уже закончили работу, процессоры VIA продолжают работать, работать и работать! :))
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 16.12.2005, 08:06


Вопрос № 31.575
Здраствуйте Эксперты у меня есть вопрос - обьясните пожайлуста на примере вот такое выражение: "Динамические массивы. Если новое число элементов больше старого, то новые элементы добовляются в конец массива, а их значения исходно будут неопределены".
Отправлен: 15.12.2005, 22:20
Вопрос задал: Gi-Woox.org (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Gi-Woox.org!
Чего-чего? Это где это такое Вы прочитали?
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 15.12.2005, 22:24

Отвечает: Denisss
Здравствуйте, Gi-Woox.org!
А чего тут непонятного?
Динамические массивы - такие массивы, длину которых можно менять (номера у таких массивов от 0 до n, длина задается функцией SetLength);
Если Вы удлиняете массив, то элементов становится больше. Эти новые элементы получают номера (n+1), (n+2), ... . И эти значения этих элементов будут неопределены, т.е. их исходное значение будет Вам неизвестно (можно даже сделать на их основе некоторое подобие генератора случайных чисел).

Приложение:

Ответ отправил: Denisss (статус: Специалист)
Отправлен: 15.12.2005, 23:28

Отвечает: Master135
Здравствуйте, Gi-Woox.org!
В моем представлении динамический массив - это множество областей памяти(оперативной памяти).
Значения, которые там были записаны раньше другими приложениями не известны. Когда область памяти свободна она помечается как свободная, но на самом деле не свободны, просто при новой записи в них данные будут затерты. Так вот "значения исходно не определены" значит, что затереть мы еще не успели и там значение, о котором мы понятия не имеем. Когда мы явно запишем туда что-то, то мы инициализируем значение этого элемента массива.
---------
И пусть кто-то скажет что я не прав....
Ответ отправил: Master135 (статус: Студент)
Отправлен: 16.12.2005, 00:49

Отвечает: Schmak
Здравствуйте, Gi-Woox.org!
Размер динамических массивов в отличие от статических можно изменять по ходу выполнения программы при помощи процедуры SetLength(a,n), где a массив, n новое кол-во элементов. При этом если новое кол-во элементов меньше старого, то лишние элементы стираются. Если новое количество элементов больше старого, то новые элементы массива добавляются в конец. При этом значения их могут быть какими угодно, поэтому прежде чем что-нибудь из них считыват в них надо что-нибудь записать, например 0 или нужные данные. (кстати к статическим массивам это тоже относится не всегда элементы при запуске программы равны 0).
Например у вас есть массив a:
var a:array of integer;
begin
Setlength(a,1); //a[0]- не определено, т.е. имеет произвольное значение
a[0]:=1;
setlength(a,5); //a[0]=1, a[1]..a[4] не определены
end;
PS нестоит забывать что нумерация элементов динамического массива идёт с 0
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 16.12.2005, 05:33

Отвечает: sir henry
Здравствуйте, Gi-Woox.org!
Что такое динамический массив я Вам рассказал в предыдущем ответе. Вот как можно определять его размер при работе программы:
Var
dm: array of integer; {Динамический массив}
i: integer;
Begin
Randomize;
i:=Random(20); {Генерируем псевдослучайное число. Оно будет размером массива}
SetLength(dm, i); {Устанавливаем размер массива. Нижний индекс у него будет 0}
End;
Если Вы повторно переопределите размер массива и новый размер будет больше старого, то в массиве просто добавятся новые ячейки, т.к. будет образован новый массив и в него скопируются данный из старого, старый уничтожается. Примерно так.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 16.12.2005, 05:39

Отвечает: Ерёмин Андрей
Здравствуйте, Gi-Woox.org!
На примере покажу:
Var A: Array Of Integer;
Это динамический массив, кол-во элементов здесь не определено. Определяем:
SetLength(A,3);
В массиве стало 3 элемента и все они имеют неопределённое значения. Если мы попытаемся обратиться к ним и прочитать их значения, в ответ получим очень большое число (граница числового диапазона данного типа).
Теперь определим эти элементы:
A[0]:=1;
A[1]:=2;
A[2]:=3;

Теперь все 3 элемента имеют значения. Затем добавим ещё 2:
SetLength(A,5);
Первые 3 элемента сохранят своё значение, а последние два будут неопределены.
---------
В то время как остальные процессоры уже закончили работу, процессоры VIA продолжают работать, работать и работать! :))
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 16.12.2005, 08:24


Вопрос № 31.594
Уважаемые эксперты!
Пытаюсь присвоить Image1.Canvas.Font.Size:=4.
Размер не уменьшается - всегда равен 8.
В большую сторону увеличивается.
Подскажите в чём причина.
Отправлен: 16.12.2005, 09:19
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss
Здравствуйте, Ramil!
Причина в том, что для выбранного Вами шрифта минимальный размер равен 8. И с этим шрифтом Вы нигде не сможете установить размер меньше 8.
Решение проблемы такое (один из вариантов): отрисуйте сначала текст на какой-нибудь другой канве (Canvas), а потом используя StretchDraw отрисуйте его на канве Image1, ужав по размерам в два раза.
Ответ отправил: Denisss (статус: Специалист)
Отправлен: 16.12.2005, 09:45

Отвечает: Ерёмин Андрей
Здравствуйте, Ramil!
Значит данный шрифт имеет минимальный размер 8. Большинство шрифтов, собственно, такие и есть. Но бывают исключения. Попробуйте использовать другие шрифты.
---------
В то время как остальные процессоры уже закончили работу, процессоры VIA продолжают работать, работать и работать! :))
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 16.12.2005, 10:40


Вопрос № 31.604
Здравствуйте.Возник вопрос.Подскажите пожалуйста.В DBGrid вывожу данные из Oracle (две колонки). У DBGrid установил свойство dgRowselect:=true. Как сделать,чтобы при выделении строки Event: onCellClick в один Edit выводилось значение одной колонки,а в другой Edit - другой?
Спасибо.

Приложение:

Отправлен: 16.12.2005, 10:50
Вопрос задал: Сусликов Евгений Павлович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Сусликов Евгений Павлович!

1) Событие, которое нужно отрабатывать - onScroll
2) Используй компонент DBEdit - и все будет выводится само-собой
Ответ отправил: Архангельский Андрей Германович (статус: Студент)
Отправлен: 16.12.2005, 11:06
Оценка за ответ: 5
Комментарий оценки:
Спасибо.Всё гораздо проще,оказывается

Отвечает: Lector
Здравствуйте, Сусликов Евгений Павлович!
Дело в том, что при переходе на новую строку курсор БД автоматически перемещается на текущую запись.
begin
Edit2.Text := DBGrid2.DataSource.DataSet.FieldByName('Field1').AsString;
Edit2.Text := DBGrid2.DataSource.DataSet.FieldByName('Field2').AsString;
end;
---------
Хочешь помочь старику - сделай вместо него.
Хочешь помочь новичку - сделай вместе с ним.
Хочешь помочь мастеру - отойди и не мешай,
а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: Студент)
Отправлен: 16.12.2005, 11:29
Оценка за ответ: 5
Комментарий оценки:
Спасибо


Вопрос № 31.613
Здравствуйте! Не подскажите ли, как сделать так, чтобы длинный текст в ячейке StringGridа или ListView в Delphi7 выводился в несколько строк.Заранее спасибо.
Отправлен: 16.12.2005, 13:11
Вопрос задал: Steel (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: nimoid
Здравствуйте, Steel!

Способов много... но практически у всех смысл один - перекрыть событие OnDraw и сделать отрисовку текста на канве ячейки.

См. в приложении один из примеров для StringGrid-a.

Приложение:

---------
Перед тем как задать вопрос, поищи сначала сам ответ. Яндекс в руки и в перед... )

Ответ отправил: nimoid (статус: 6-ой класс)
Отправлен: 16.12.2005, 17:41


Вопрос № 31.621
Здравствуйте эксперты !
А как проиграть DVD-файлы (ну, там vob, ifo и т.д. всякие)
Отправлен: 16.12.2005, 16:25
Вопрос задал: Vic (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss
Здравствуйте, Vic!
Как отобразить меню DVD диска я не знаю, но воспроизводить файлы можно с помощью набора компонентов DSPack (последняя версия 2.3.4, если я не отстал от жизни). Там в примерах есть один, показывающий как воспроизводить DVD (почти готовый ДВД-плеер, только недоделанный чуть-чуть).
Ответ отправил: Denisss (статус: Специалист)
Отправлен: 16.12.2005, 18:41


Вопрос № 31.626
Господа эксперты, приветствую всех, подскажите плз.
C++Builder 6
есть небольшое приложение, работающее с базой данных под FireBird 1.5.2 + IBX
во время выполнения работает все чудесно, все функционирует и выполняется, прям любо-дорого работать, а вот когда приложение закрываешь, оно иногда вылетает с ошибкой
Инструкция по адресу "0x006b3afc" обратилась к памяти по адресу "0x00fe3504". Память не может быть "written". это сообщение появляется дважды, а потом 3-е "Abnormal program termination".
динамическое выделение памяти использую тока в 2-х местах (я с ним пока тока начал дружить) и в обоих случаях память освобождаю, посоветуйте хоть куда копать, от ошибки избавиться нужно полюбому, переделывать не просто долго, а оч. долго
всем спасибо :)
Отправлен: 16.12.2005, 17:53
Вопрос задал: Степанюк Александр (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lector
Здравствуйте, Степанюк Александр!
Нужно дубегить. Может получится узнать, какой компонент ругается.
Ещё часто бывает, что датасета ежу нет, а грид или другой ДБ компонент об этом не знает и пытаетс обновится... Кроме того с++ со своей поддержкой прямых операций с памятью бывает очень трудным для отладки...
---------
Хочешь помочь старику - сделай вместо него.
Хочешь помочь новичку - сделай вместе с ним.
Хочешь помочь мастеру - отойди и не мешай,
а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: Студент)
Отправлен: 16.12.2005, 17:58

Отвечает: sir henry
Здравствуйте, Степанюк Александр!
Все объекты, которые Вы используете в своей программе, динамические. Следовательно память выделяется не только Вами непосредственно, но и самой программой для объектов. У Вас происходит обращение к какому-то методу или свойству объекта, который Вы уже уничтожили. А вот где это - смотрите сами.
Составьте список объектов. Где они создаются и где удаляются, отследите обращения к ним. Тогда Вы найдете обращение к уже удаленному объекту.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 16.12.2005, 18:13

Отвечает: Denisss
Здравствуйте, Степанюк Александр!
Ошибка может быть где угодно. Надо внимательно изучать код, запускать программу в режиме отладки, выяснять когда происходит ошибка, отлаживать эти места.
Ошибка возникает не только когда Вы напрямую "просите" память у ОС. Она также может возникнуть, если Вы, например, попытаетесь обратиться к несозданному объекту.
Ответ отправил: Denisss (статус: Специалист)
Отправлен: 16.12.2005, 18:22


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное