小编Gle*_*234的帖子

用一个词计算音节

我正在寻找一个完全准确的算法陈述来计算单词中的音节.我研究时发现的不一致或我所知道的结果不正确.有没有人有任何建议如何实现这一目标?谢谢.

我现在使用的算法:

  1. 计算单词中的元音数量.
  2. 不要算双元音("雨"有2个元音但只有1个音节)
  3. 如果单词中的最后一个字母是元音不计数("side"是1个音节)

我还缺少更多规则吗?如果我使用的算法错误或我的实现,我正在尝试确定我的错误结果的测试.

string algorithm

23
推荐指数
2
解决办法
2万
查看次数

函数参数中的高效指针处理

正如上面的主题所示,我想知道是否有一个很好的例子来处理在按顺序处理数据时在函数parms中传递的指针.我所拥有的是:

function myfunc(inptr: pointer; inptrsize: longint): boolean;
   var
     inproc: pointer;
     i: integer;
   begin
     inproc := inptr;
     for i := 1 to inptrsize do
       begin
         // do stuff against byte data here.
         inc(longint(inproc), 1);
       end;
   end;
Run Code Online (Sandbox Code Playgroud)

我的想法是,不管有多大的数据,我都希望它能够处理被推送的任何数据,而不是有限的数据.

现在谈到处理数据时,我已经想出了几种成功的方法.

  1. 将parm指针分配给相同的临时指针,然后使用它们访问每个数据,递增它们以继续.这种方法是最快的,但不是很干净,所有指针增量遍布整个代码.(这就是我上面所说的)
  2. 将parm指针分配给表示大数组值的指针,然后使用标准表逻辑对其进行递增处理.更清洁,但比#1慢约500毫秒.

有没有其他方法以这种方式有效地处理处理指针,或者是否有一些我缺少的方法,既干净又不浪费时间?

delphi pointers

5
推荐指数
1
解决办法
314
查看次数

记录类型的前向声明

标题中有这样的东西吗?我试图在转换API结构的过程中做到这一点,并遇到以前没有遇到的事情:

PFNReaderTranslatedDispatch = function(var msg: TMsg): BOOL; stdcall;
PFNReaderScroll = function(var prmi: TReaderModeInfo; dx, dy: integer): BOOL; stdcall;
TReaderModeInfo = record
  cbSize: DWord;
  hWnd: THandle;
  fFlags: DWord;
  prc: PRect;
  pfnScroll: PFNReaderScroll;
  fFlags2: PFNReaderTranslatedDispatch;
  lParam: DWord;
end;
PReaderModeInfo = ^TReaderModeInfo;
Run Code Online (Sandbox Code Playgroud)

知道Delphi的人会看到明显的问题.你会如何解决这个问题?

delphi types

5
推荐指数
1
解决办法
1709
查看次数

完成旧曲目后,如何让TWindowsMediaPlayer播放新曲目?

我正在使用TWindowsMediaPlayer并遇到问题。当前歌曲完成后,我无法加载新歌曲然后播放。

procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject;
          NewState: Integer);
  begin
    if (NewState = wmppsMediaEnded) then
      begin
        WMPlayer1.URL := FileScanner.SelectSong;
        writeln('Play triggered on ', String(WMPlayer1.URL));
        WMPlayer1.controls.Play;  // DOES NOT PLAY THE SONG!
      end;
  end;
Run Code Online (Sandbox Code Playgroud)

这会加载歌曲,但需要其他用户干预才能实际播放。我要让它继续下去的唯一方法是检查wmppsStopped,但是该事件发生了两次,所以我得到了列表中的所有奇数编号的歌曲。

关于如何使其正确运作的任何想法?

delphi windows-media-player

5
推荐指数
1
解决办法
2051
查看次数

适当的灾难性错误处理

有一些我一直在努力的东西,我真的没有用Delphi程序解决,并想知道是否有人可以指导我.正如主题所说,你如何做正确的灾难性错误处理?例如:

// is file necessary for the program present?
if not FileExists(FilePath1) then
   begin
     raise Exception.Create(FilePath1 + ' does not exist and is required for this program to function.');
   // I obviously need to do something here to make the program QUIT and not have
   // any more code run.

     Application.Terminate;
     Abort;
   end;
Run Code Online (Sandbox Code Playgroud)

我也可以在那里使用异常单元并抛出异常,但程序继续像以前一样.我过去曾经使用过停止呼叫,但它似乎没有进行任何清理等等,所以我最终制定了一个大程序,通过近距离和免费调用我所做的一切就是为了确保(即使那时我我不确定任何幕后的东西.

那么处理这类事情的正确方法是什么?

编辑:为了澄清,我想知道如何让程序做它需要做的清理,然后立即退出而不做任何其他代码.

delphi error-handling delphi-2006 delphi-3

4
推荐指数
1
解决办法
876
查看次数

当我在线程上调用Free时,为什么我的程序会挂起?

我放弃使用FreeOnTerminate := true支持将其显式设置为false,但现在每次尝试显式释放线程时代码都会锁定.我确定在Free声明中发生了锁定.

对于线程进程的最后一步,我正在向我在主对象中创建的窗口句柄发送一条消息,表示"完成".在那里我正在运行一个事件,然后免费.为什么会这样?

delphi multithreading

3
推荐指数
1
解决办法
195
查看次数

Unicode字符串中的奇数字符

当谈到获得MP3 ID3 v2实现时,我正在遇到一些问题.除了这一个问题之外,我大部分时间都在工作,这可能与此根本无关.无论如何,我正在使用以下代码来处理检索涉及文本的标头标签的数据.

我遇到的是(我猜?)我在一些不同的字符串中遇到Unicode字符.我试图在下面转换它,它的工作原理.但是我在字符串之前获得了3F的奖金,之后获得了$ 3F $ 3F.我可以对下面的代码做些什么来解析那些或者我必须自己做吗?文件由ITunes编码,如果这有助于任何.

function Id3v2_string(currp: pointer; datasize: integer): string;
{ handles string processing for ID3v2 data }
  const
    IS_TEXT_UNICODE_UNICODE_MASK = $0F;
  var
    outstr: string;
    uscan: integer;
  begin
    outstr := '';
    SetLength(outstr, datasize);
    uscan := IS_TEXT_UNICODE_UNICODE_MASK;
    if IsTextUnicode(currp, datasize, @uscan) then
      outstr := WideCharToString(currp)
    else
      move(currp^, outstr[1], datasize);
    Result := outstr;
  end;
Run Code Online (Sandbox Code Playgroud)

注意,我真的对媒体库不感兴趣,因为我所要做的就是编辑ID3标签而不是播放文件 - 除了像这样的一些小问题之外,实现已经完成.

delphi mp3

3
推荐指数
1
解决办法
1276
查看次数

为什么我的应用程序中的Cardinal类型发生了变化?

我有一个程序在Delphi 3中运行正常,我在Turbo Delphi 2006上编译和测试,发现了一个问题.问题是:我使用"基数"数据类型作为某种东西的索引.它在Delphi 3中有效,但我发现Turbo Delphi 2006编译版本的值大于128-256左右,具体取决于具体的数据.将这些数据类型更改为"longint"修复了问题,以便程序与两个编译器一起正常工作.

问题:这是为什么?

我的理解是Cardinal数据类型只是典型的无符号整数数据.这与它们在这个程序中的应用是一致的,特别是通过Delphi 3编译正常工作的事实证明了这一点.那么为什么Turbo Delphi 2006编译不起作用呢?

delphi delphi-2006 delphi-3

3
推荐指数
1
解决办法
422
查看次数

阻塞循环时线程代码不稳定

我正在尝试使用线程进程,但是多次执行似乎变得更加不稳定.有没有人对如何确定原因是什么有任何想法?但是,一个很大的区别是,我在多次执行时使用了一个阻塞循环,而不是让它以异步方式通过,就像我编写它一样.

这是我正在使用的等待循环代码(最明显的起点).我需要这样做,所以TMainObject可以处理FThreadProcess发送的消息中的任何事件.

procedure TMainObject.WaitForCompletion;
  begin
    repeat
      Application.ProcessMessages;
    until WaitForSingleObject(FThreadProcess.Handle, 20) = WAIT_OBJECT_0;
  end;
Run Code Online (Sandbox Code Playgroud)

当我拿出每个项目并在不同的运行中异步处理它时,我没有任何问题.有没有人对要检查的事情有任何其他想法?谢谢.

delphi multithreading

1
推荐指数
1
解决办法
160
查看次数

CAB文件API澄清

由于我在任何地方都没有看到任何内容,并没有指出原有的Microsoft文档,或者源代码似乎没有回答我的问题,我想我可能会问一些这里的事情.(Delphi标签就在那里,因为这就是我的开发环境对我正在制作的代码的影响)

也就是说,我有一些问题,API文件没有回答.第一个:fdi_notify消息.什么是"我的责任"是编码这些:fdintCABINET_INFO: fdintPARTIAL_FILE: fdintNEXT_CABINET: fdintENUMERATE:?我将通过一个例子说明我的意思.因为fdintCLOSE_FILE_INFO,"我的责任"是关闭与给定的句柄相关的文件,并根据fdi_notify中传递的数据设置文件的日期和时间.

我想我错过了什么,因为我的代码没有处理提取跨越的CAB文件......有关如何做到这一点的任何想法?

delphi winapi cab

0
推荐指数
1
解决办法
993
查看次数