Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OOD
FanAndTemp.exe -- отсутствует провайдер или требуемое устройство.
Everest все показывает.
(ОС: winXP SP2, Win 2k Server)

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 14:39 13-03-2007
OOD

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RostY

Цитата:
Everest все показывает.

У Вас есть исходники Everest ?

Всего записей: 3379 | Зарегистр. 20-05-2006 | Отправлено: 15:24 13-03-2007
George_Lucky



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос,
процедура получает в качестве параметра obj: TObject
 
в теле процедуры необходимо работать со свойствами, но в различных вариантах:
TEdit(obj).... или TmyEdit(obj)
эти классы растут не из одного источника, но методы у них одинаковые.
Как гибко использовать один раз эти методы, но для разных классов?
 
а пока получается такая лабуда:
 
if obj is TEdit then
   str := TEdit(obj).Text
else if obj is TmyEdit then
  str := TmyEdit(obj).Text;

Всего записей: 413 | Зарегистр. 12-09-2002 | Отправлено: 15:27 13-03-2007
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
George_Lucky
В таком случае надо юзать интерфейсы. Или сделать у них общего предка.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:51 13-03-2007
relictus

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли как-то ускорить нижеприведенный код копирования файлов (в случае с десятками тысяч файлов):

Код:
function WindowsCopyFile(FromF, ToF : string) : boolean;
var F: TShFileOpStruct;
begin
  F.Wnd := 0; F.wFunc := FO_COPY;
  FromF:=FromF+#0; F.pFrom:=pchar(FromF);
  ToF:=ToF+#0; F.pTo:=pchar(ToF);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SIMPLEPROGRESS;
  result:=ShFileOperation(F) = 0;
end;
 

 
Добавлено:
Полчаса работы, а результат такой (еще копировать около 300 Мб)
Paзмep:           23,7 MБ (24 881 060 бaйт)
Ha диcкe:        28,2 MБ (29 634 560 бaйт)
Coдepжит:       Фaйлoв: 2 313; пaпoк: 679

Всего записей: 3717 | Зарегистр. 19-04-2005 | Отправлено: 16:50 13-03-2007
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
relictus
Цитата:
Полчаса работы, а результат такой (еще копировать около 300 Мб)
Вы меня, конечно, извините, но...
вопросы следующие:
1)  это разовое копирование? Может его не стоит делать на Дельфи?
2) Можно попробовать копировать файл через старый способ BlockRead/BlockWrite
   либо через TFileStream...
3) теоретически запуск копирование каждого файла в отдельном потоке TThread может увеличит производительность за счёт распараллеливания...
4) как вы перебираете файлы FromF - может быть задержки именно на получении имени файлов?
5) если копировать через командную строчку ( COPY ) - получается быстрее? Насколько?...
 
 

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:28 13-03-2007
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кажется, здесь уже проскакивала тема о копировании файлов. Можно попробовать копировать с использованием буффераПодробнее..., можно через потоки Подробнее..., можешь попробовать через CopyFile(), можешь попробовать отключить антивирус
 
Добавлено:
еще кусок кода (не мой, автора, пусть меня извинит, не помню)
Подробнее...
 
Добавлено:
при использовании буффера желательно поставить размер буффера = N * [размер кластера диска]

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 17:39 13-03-2007 | Исправлено: RostY, 17:46 13-03-2007
svs123456789

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как правильно организовывать в Delphi связь многие ко многим  
и как автоматизировать этот процесс?
 
2 таблицы A и B связанные многие-ко-многим (черз промежуточную таблицу AB) в базе данных
 
соответсвенно 3 dataset в delphi
в случае master-detail делфи автоматизирует работу указанием свойства мастер соурсе у подчиненного датасета
и передачей в подчиненный запрос параметра :id из главного запроса
 
но у промежуточной таблицы AB есть только одно поле для ссылки на главный запрос, а она (AB) должна быть подчиненной сразу двум таблицам и А и B
 
как правильно добавлять и удалять записи из табоицы B ?

Всего записей: 2934 | Зарегистр. 10-04-2003 | Отправлено: 20:09 13-03-2007
relictus

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SERGE_BLIZNUK

Цитата:
1)  это разовое копирование?

Это типа конвертора кэша двух разных программ... операция, в принципе, одноразовая: надо конвертировать одну директорию с тысячами небольших (10-20 кило) файлов вида tqrstqsststrt.jpg в другую директорию, но уже разбитую по такому принципу: каждая буква имени картинки - это одноименная поддиректория, т.е. вышеприведенный пример должен записаться в папку ../t/q/r/s/t/q/s/s/t/s/t/r/t.jpg с созданием (если они отсутствуют) этих самых поддиректорий.  
Как это можно сделать оптимально быстро? Не спрашивая юзера о создании поддиректорий...

Всего записей: 3717 | Зарегистр. 19-04-2005 | Отправлено: 20:11 13-03-2007
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
svs123456789
Мой тебе совет - учи SQL. Юзать отдельно датасет для каждй таблички - тока в книгах видел.  
СКБД какая?
Или опиши проблему подробнее, поскажу как зделать по другому.
 
Добавлено:
relictus

Код:
procedure Copy(aDirFrom, aDirTo, aMask: string);
var
  OpStruc: TSHFileOpStruct;
  FromBuf, ToBuf: array [0..128] of Char;
begin
  FillChar(FromBuf, SizeOf(FromBuf), 0);
  FillChar(ToBuf, SizeOf(ToBuf), 0);
  StrPCopy(FromBuf, aDirFrom+aMask);
  StrPCopy(ToBuf, aDirTo);
  try
    with OpStruc do
    begin
      wFunc:= FO_COPY;
      pFrom:= @FromBuf;
      pTo:= @ToBuf;
      fFlags:= FOF_NOCONFIRMATION;
      fAnyOperationsAborted:= False;
      hNameMappings:= nil;
      lpszProgressTitle:= nil;
    end;
    SHFileOperation(OpStruc);
    Log('Files are copied successfully'+
        ' <From>: '+aDirFrom+
        ' <To>: '+aDirTo);
  except
    on e:Exception do
      Log('Error at copying files into '+aDirTo+#13+#13+e.Message);
  end;

Думаю дальше доделаеш сам.
Че нада обьяснить - спрашивай.

----------
Я не страдаю манией величия, я ею наслаждаюсь(с)

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 20:15 13-03-2007 | Исправлено: Solnake, 20:25 13-03-2007
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc

Цитата:
пример XML в студию  
может FindNode, но это пока догадки

есть XML файл (упрощённая версия):
 

Код:
<?xml version="1.0" encoding="utf-8" ?>
 
<ProvidersList>
   <provider name="asd" id="0" />
   <provider name="sdf" id="1" />
   <provider name="dsf" id="2" />
</ProvidersList>

 
нада без цикла добраться до <provider name="sdf" id="1" />
XMLDocument1.DocumentElement.ChildNodes[номер_ид]... не предлагать

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 23:25 13-03-2007
VadimLou



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Windows API CompareString
 
Блин, неправильно работают ф-ции сравнения строк AnsiCompareXXX.
Т.к. они являются обкруткой вокруг виндячей CompareString то проблема именно в последней.
 
Вот пример кода с ошибкой для буквы "Ё".
 
asrt;
 
{$APPTYPE CONSOLE}
 
uses
  Windows, SysUtils, Classes;
 
const
  sRU: array[ 0 .. 3 ] of string = (
    'ЛБ',
    'ЛЕ',
    'ЛБС',
    'ЛЕС'
  );
  sRU2: array[ 0 .. 3 ] of string = (
    'ЛБ',
    'ЛЕ',
    'ЛБС',
    'ЛЕС'
  );
var
  i, iCmp: Integer;
  S1, S2, sCmp: string;
  L1, L2: Integer;
  S1a, S2a: string;
begin
  Writeln('------------------------');
 
  S2 := 'ЛЁ';
  L2 := Length(S2);
  SetLength(S2a, Length(S2));
  AnsiToOEM( PChar(S2), PChar(S2a) );
 
  for i := 0 to High(sRU) do
  begin
 
    S1 := sRU[i];
    L1 := Length(S1);
 
    // AnsiCompareText:
    iCmp := Windows.CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE,
      PChar(S1), L1, PChar(S2), L2) - 2;
 
    case iCmp of
     -1: sCmp := '<  ';
      0: sCmp := ' = ';
      1: sCmp := '  >';
      else
        sCmp := '?('+IntToStr(iCmp)+')';
    end;
 
    SetLength(S1a, Length(S1));
    AnsiToOEM( PChar(S1), PChar(S1a) );
 
    Writeln(S1a:5, '  ', sCmp:9, '  ', S2a);
 
  end;
 
 
  S2 := 'ЛР';
  L2 := Length(S2);
  SetLength(S2a, Length(S2));
  AnsiToOEM( PChar(S2), PChar(S2a) );
 
  Writeln('------------------------');
 
  for i := 0 to High(sRU2) do
  begin
 
    S1 := sRU2[i];
    L1 := Length(S1);
 
    // AnsiCompareText:
    iCmp := Windows.CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE,
      PChar(S1), L1, PChar(S2), L2) - 2;
 
    case iCmp of
     -1: sCmp := '<  ';
      0: sCmp := ' = ';
      1: sCmp := '  >';
      else
        sCmp := '?('+IntToStr(iCmp)+')';
    end;
 
    SetLength(S1a, Length(S1));
    AnsiToOEM( PChar(S1), PChar(S1a) );
 
    Writeln(S1a:5, '  ', sCmp:9, '  ', S2a);
 
  end;
  Writeln('------------------------');
 
end.
 
Результат работы:
------------------------
   ЛБ        <    ЛЁ
   ЛЕ        <    ЛЁ
  ЛБС        <    ЛЁ
  ЛЕС          >  ЛЁ  ** тут должно быть наоборот
------------------------
   ЛБ        <    ЛР
   ЛЕ        <    ЛР
  ЛБС        <    ЛР
  ЛЕС        <    ЛР
------------------------
 
Ни у кого нету замены для системной CompareString ?
 
Кстати для уникодного CompareStringW теже яйца... не любят они славян ...
 

Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 00:05 14-03-2007 | Исправлено: VadimLou, 00:19 14-03-2007
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andead
думаю без цикла не получится.
XML это тотже текстовый документ.
У тебя id аттрибут узла provider, а поиск сделан
по узлам тем же циклом ( по крайней мере в тех компонентах которые я смотрел)
Подробнее...  

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:25 14-03-2007
nEJIbMEHb3

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Похоже хотят именно FindNode если ограничение на цикл.

Всего записей: 21 | Зарегистр. 09-04-2004 | Отправлено: 09:20 14-03-2007
svs123456789

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Solnake

Цитата:
Мой тебе совет - учи SQL. Юзать отдельно датасет для каждй таблички - тока в книгах видел.  

а ты можешь сделать sql команды без создания объекта типа tdataset ?

Всего записей: 2934 | Зарегистр. 10-04-2003 | Отправлено: 09:37 14-03-2007
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nEJIbMEHb3

Цитата:
FindNode
ищет узел, а не аттрибуты
 
VadimLou
1. Убери код в теги more
2. ф-ции сравнения работают правильно !
ошибка в том что код буквы Ё - 401 и находится она перед всем алфавитом
( код буквы А - 410) так что тут есть 2 пути
первое(если не критично) меняй Ё на Е. второе проверяй сам.
например програмно вычесть из кодов букв А-Е единичку и вствить твою Ё
PS а для сторчных ё>я

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 09:42 14-03-2007 | Исправлено: greenpc, 09:53 14-03-2007
nEJIbMEHb3

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В .NET есть FindAttribute Но мы тут про Дельфи

Всего записей: 21 | Зарегистр. 09-04-2004 | Отправлено: 10:10 14-03-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andead
Вставлю свои 5 копеек
Если использование TXMLDocument не критично - предлагаю юзать MSXML-парсер. Там без цикла легко можно получить нужный узел при помощи XPath:

Код:
Node := Doc.selectsinglenode('/ProvidersList/provider[@name="sdf" and  @id="1"]');  

Кроме этого там масса удобных функций и возможностей - а единственный минус (IMHO) так это требование наличия парсера на конечной машине.
 

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 10:21 14-03-2007
gogaman



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу вашей помощи я не силен в программировании и врядли осилю.
Но вот возникла необходимость сделать 2 вещи.
1. Это слепить 2 файла в один ехе сделать форму закинуть 3 кнопки и по нажатию кнопки открывать файлы и закрыть форму. Как закрыть форму уже разобрался. Даже слепил 2 файла в ресурс и присоединил к форме а вот присвоить кнопке вызов файла из ресурса не как лиш удалось просто извлечь и сохранить а хотелось запускать файл из ехе а при его закрытии чтоб он не где не сохранялся.
 
procedure TForm1.Button1Click(Sender: TObject);
var f1: TResourceStream;
begin
f1 := TResourceStream.Create(hInstance, 'f1', RT_RCDATA);
f1.SaveToFile('1.doc');
f1.Free;
end;  
 
2. Просто указать кнопке запуск файла к примеру в папке лежит 3 файла мне нужно из формы запускать при нажатии кнопки файл.
 
Заранее благодарен.

Всего записей: 583 | Зарегистр. 22-06-2005 | Отправлено: 11:01 14-03-2007
Solnake



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
svs123456789

Цитата:
а ты можешь сделать sql команды без создания объекта типа tdataset ?

Не понял полноты вопроса.
Вам нада связать датасеты. Вопрос - зачем? Если для того чтобы связать запросы в один - SQL. Если для того чтобы визуальные компоненты отображали чето связаное по FK - так можна обойтись без всяких связей этих датасетов. Событий компонентов, сорсов предостаточно.
Опишите что вам именно нада.
 


----------
Я не страдаю манией величия, я ею наслаждаюсь(с)

Всего записей: 826 | Зарегистр. 16-09-2004 | Отправлено: 11:04 14-03-2007 | Исправлено: Solnake, 11:08 14-03-2007
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru