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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    Это и есть ваши значения, только в UTF (вроде как)

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 12:35 30-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    поскольку вы не показываете весь код - остаётся только гадать что и где там у вас происходит... а вдруг вы просто еще раз в коде руками создаёте свой TMarkTable и т.о. он перезаписывает тот, который из dfm загрузился

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 20:39 30-11-2012
    xliker



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Вот класс компонента:

    Код:
     
    type
      TArray = class
      private
        FMark : array[0..19] of integer;
        FCount : integer;
        FSize : integer;
      public
        constructor Create;
        procedure SetValue(ind, value : integer);
        function GetValue(ind : integer) : integer;
        procedure SetArray(a : TArray);
        procedure Clear;
        procedure Add(a : integer);
        property Count : integer read FCount write FCount;
        property Size  : integer read FSize write FSize;
      end;
     
     
      TMarkTable = class(TStringGrid)
      private
        FFio  : TStrings;
        FMark : TArray;
      protected
        procedure SetFio(value : TStrings);
        procedure SetMark(value : TArray);
        function  SelectCell(ACol, ARow : Longint) : boolean; override;
        procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);  override;
      public
        constructor Create(AOwner : TComponent); override;
        procedure   MoveData();
        destructor  Destroy();  override;
      published
        property Fio : TStrings read FFio write SetFio stored True;
        property Mark : TArray read FMark write SetMark;
      end;
     
    procedure Register;
     
    implementation
     
    uses Math;
     
    procedure Register;
    begin
      RegisterComponents('Samples', [TMarkTable]);
    end;
     
    constructor TMarkTable.Create(AOwner : TComponent);
    begin
      FFio := TStringList.Create;
      FMark := TArray.Create;
      inherited Create(AOwner);
      ColCount := 2;
      RowCount := 2;
      FixedCols := 0;
      FixedRows := 1;
      Cells[0,0] := 'Ôàìèëèÿ';
      Cells[1,0] := 'Áàëë';
    end;
     
    destructor TMarkTable.Destroy();
    begin
      FFio.Free;
      FMark.Free;
      inherited Destroy;
    end;
     
    procedure TMarkTable.SetMark(value : TArray);
    begin
      FMark.SetArray(value);
    end;
     
    procedure TMarkTable.SetFio(value : TStrings);
    begin
      FFio.Assign(value);
      MoveData;
    end;
     
    procedure TMarkTable.MoveData();
    var
      i : integer;
    begin
      RowCount := Max(Fio.Count, Mark.Size) + 1;
      for i:=0 to FFio.Count-1 do
        Cells[0,i+1] := Fio.Strings[i];
      for i:=0 to FMark.Size-1 do
        Cells[1,i+1] := IntToStr(Mark.GetValue(i));
    end;          
     
    constructor TArray.Create;
    begin
      inherited Create;
      Count := 20;
      Size := 0;
    end;
     
    procedure TArray.SetValue(ind, value : integer);
    begin
      FMark[ind] := value;
    end;
     
    function TArray.GetValue(ind : integer) : integer;
    begin
      result := FMark[ind];
    end;
     
    procedure TArray.Clear;
    begin
      FSize := 0;
    end;
     
    procedure TArray.Add(a : integer);
    begin
      FMark[FSize] := a;
      inc(FSize);
    end;
     
    procedure TArray.SetArray(a : TArray);
    var
      i : integer;
    begin
      Clear;
      for i := 0 to a.FSize - 1 do
        Add(a.GetValue(i));
    end;
     
    function TMarkTable.SelectCell(ACol, ARow : Longint) : boolean;
    begin
      InvalidateGrid;
      result := true;
    end;
     
    procedure TMarkTable.DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
    begin
      inherited;
      if gdFocused in State then
      begin
        Canvas.Font.Color := RGB(238,43,67);
        Canvas.Font.Style := [fsBold];
        Canvas.Brush.Color := RGB(223,185,133);
        Canvas.FillRect(Rect);
        Canvas.TextOut(Rect.Left, Rect.Top, AnsiUpperCase(Cells[ACol,ARow]));
      end
      else
      if not (gdFixed in State) then
      begin
        Canvas.Font.Color := clBlack;
        Canvas.Font.Style := [];
        Canvas.Brush.Color := clWhite;
        Canvas.FillRect(Rect);
        Canvas.TextOut(Rect.Left, Rect.Top, AnsiLowerCase(Cells[ACol,ARow]));
      end
    end;    
     
    end.
     

    Всего записей: 17 | Зарегистр. 06-09-2011 | Отправлено: 23:57 30-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    код как будто ок, имелся в виду еще и код формы. не создаётся ли там вручную где-нибудь что-то поверх того что есть, типа mt := TMarkTable.Create(....)

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 00:42 01-12-2012
    xliker



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ant0ni02004, форму пустую создаю и кидаю на нее компонент из палитры, юнит вообще пустой, разве что MarkTable1 : TMarkTable;

    Всего записей: 17 | Зарегистр. 06-09-2011 | Отправлено: 01:20 01-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    Да все у вас правильно, просто нужно переопределить метод Loaded и туда запихнуть MoveData
     
    procedure Loaded; override;
     
    ...
    procedure TMarkTable.Loaded;
    begin
      inherited;
      MoveData;
    end;
     
    Как-то так

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 14:59 01-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Вопрос к знатокам. Нужно организовать поиск известных сигнатур в файле. Т.е. что то типа HyperRipper, только проще. Нужно искать только wav-файлы (RIFF-WAVE). Есть код на делфи, но он не умеет работать с файлами, размер которых > 2 Gb. А для сканирования используются файлы > 6 Gb. Можно ли этот код переделать так, чтобы он хавал большие файлы?
     
    Код:
     
    Подробнее...

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 17:19 05-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    Код жгучий конечно
     
    Одно это  

    Цитата:
     if buffer[i]='R' then  
        if buffer[i+1]='I' then  
          if buffer[i+2]='F' then  
            if buffer[i+3]='F' then  
              if buffer[i+8]='W' then  
               if buffer[i+9]='A' then  
                if buffer[i+10]='V' then  
                 if buffer[i+11]='E' then Begin  
     

    вызывает восторг
    можно было в одну строчку через and записать - читать удобнее было бы...
     
    По существу - попробуй заюзать
    хттп://gp.17slon.com/gp/gphugefile.htm
     
    на крайний случай спроси у гугла:
     
    delphi how to open file more than 2GB

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:39 05-12-2012 | Исправлено: salexn1, 17:40 05-12-2012
    R3Pa4eK



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

    Цитата:
    Код жгучий конечно



    Цитата:
    хттп://gp.17slon.com/gp/gphugefile.htm  

    Хм.. Переписал код под этот компонент, получилось как то так:
     
    Код
     
    Wav-файлы он нашел. Но осталась прежняя проблема. Попробовал скормить ему файл, размером 5,11 ГБ (5 497 558 131 байт), программа закрылась после 20 сек. работы. Возможно это связано с тем, что bufsize=65535? Может нужно, чтобы bufsize = filesize?
     
    Добавлено:
    В общем, попробовал подставить вместо BufSize размер файла. Программа просто закрывается, видимо переполнение буффера. Даже не знаю, что делать...

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 18:17 05-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Еще заметил такую вещь. Если вместо динамически изменять размер Buffer, то появляется ошибка "Access violation at adress ... in module "test.exe" Write of adress ...". Т.е. вместо "TBuffer = Array [1..65535] of Char;" написал "TBuffer = Array of Char;", потом в коде: "SetLength(Buffer, 65535);". Что не так? О_о

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 20:24 05-12-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    если размеры файла больше 2ГБ то все переменные-позиции должны быть int64 а не integer
    также осваивайте работу через TFileStream, он умеет. а вот blockread и ему подобные чисто паскалевские i/o не способны с большими файлами работать

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 21:05 05-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ant0ni02004
    Я это понял. Смотри предыдущий код. Там используется специальный компонент, который умеет работать с большими файлами. Но всё равно, если подсунуть программе файл, больше 2 Gb, вылетает ошибка. Насколько я понял, это как то связано с bufsize... А вот как исправить, увы, не знаю

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 21:16 05-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    почему стойка (Undeclared identifier: 'key') на >>  key[i] := value;
    что объявить для массива?

    Код:
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       f : TextFile;
       value, i : Integer;
    begin
       if OpenDialog1.Execute then
       begin
          AssignFile(f, OpenDialog1.FileName);
          Reset(f);
     
          i := 0;
          while not SeekEof(f) do
          begin
             Read(f, value);
             Inc(i);
             key[i] := value;
          end;
          CloseFile(f);
     
       end;
    end;

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 21:38 05-12-2012
    R3Pa4eK



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

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 21:46 05-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    теперь ругня на ту же строчку, но иначе:
    E2010 Incompatible types: 'Char' and 'Integer'
    вроде все для массива целых чисел прописано.
     
    попробовал подставить
    array of array of integer вместо Array of Char:
    E2010 Incompatible types: 'Dynamic array' and 'Integer'
     
    а вроде как просто.
    открыть файл и считать содержимое в массив...на бумажке просто.

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 22:23 05-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    folta
    А почему именно в массив? Вот Ваш код с использованием WinApi:
    Код
     
    А если нужно перевести в массив, то используйте следующую функцию:
     

    Код:
     
    type
      TArrayOfStrings = array of AnsiString;
     
    function StringToArray(Text, Cut: AnsiString): TArrayOfStrings;
    var
      t, i, k: Integer;
    begin
     SetLength(Result, 0); if Cut = '' then Cut:= #1310;
      repeat SetLength(Result, Length(Result) + 1); t:= 1; k:= Pos(Cut, Text);
      if k > 0 then t:= Length(Cut); i:= Length(Result) - 1;
      if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:=Text; SetLength(Text, 0) end;
      until Length(Text) = 0;
    end;
     
    //var a: TArrayOfStrings;  
    //a:= StringToArray(S, #13#10);
     

     
    /fxd
    Всё, разобрался. Огромное спасибо salexn1 и ant0ni02004 за подсказки =)

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 22:35 05-12-2012 | Исправлено: R3Pa4eK, 22:42 05-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    да, спасибо. всё замечательно.
     
    только теперь мне несладко придется)
    задача такова, взять файл>вычитать цифры в массив>с помощью chart отрисовать график.
    метод с которым я возился, более менее понятен был. как чего сформировано.
    теперь, надо подтягивать знания по иным функциям.
    ну, все что впервые видишь, кажется непостигаемым и непробиваемым))
     
    все одно спасибо.
    уж лучше расширять кругозор, чем топтаться по знакомому пяточку.

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 23:34 05-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
     
    Код может и правильный с точки зрения работы, но  
    1) он не читаемый
    2) не оптимальный по памяти
     

    Код:
     
    function StringToArray(Text, Cut: AnsiString): TArrayOfStrings;  
    var
      t, k, count, MaxLength: Integer;
    begin
      count := 0;
      if Cut = '' then
        Cut:= #13#10;
      t := Length(Cut);
      MaxLength := Length(Text);
      repeat
        SetLength(Result, count + 1);
        k:= Pos(Cut, Text);
        if k > 0 then
        begin
          Result[count] := Copy(Text, 1, k - 1);
          Text := Copy(Text, k + t, MaxLength);
        end
        else
        begin
          Result[count] := Text;
        end;
        inc(count);
      until k = 0;
    end;
     

     
    Так читать проще и лишние вычисления выброшены.
     
    В таком алгоритме будет сильная фрагментация памяти. Лучше всего посчитать кол-во Cut (я так понимаю это разделитель) и сразу сделать нужный размер массива.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 11:38 06-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    так)
    назрел следующий вопрос. возможно смешной и некорректный.
    не хотит обустраиваться в type
    TArrayOfStrings = Array of AnsiString;  
    именно Array > "expected but @ received array"
    даже с TDelim=set of Char
    E2169 Field definition not allowed after methods or properties
     
    Embarcadero RAD Studio XE Version 15.0.3953.35171
    чую что собака в этом. не?!  
     

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 12:40 06-12-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Вы его не туда пихаете. Внимательно посмотрите где определение класса формы заканчивается.
    И кстати, почему было ”key: array of integer” не сделать?

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 14:09 06-12-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru